Mam aplikację MVC z kilkoma prostymi stronami, które w większości będą działały w wywołaniach Web API. Dla uproszczenia chcę je uwzględnić w tym samym projekcie. Mogę uruchomić i nawigować po mojej stronie, ale kiedy próbuję wywołać moje API przez Ajax, ciągle otrzymuję błąd 404 - nie mogę znaleźć funkcji API.Nie można połączyć się z kontrolerem WebAPI za pośrednictwem AJAX, gdy jest on hostowany za pomocą MVC
Oto mój plik javascript:
$(document).ready(function() {
//set the login button to call our test API function
document.getElementById("login_submit").addEventListener("click", GetUser);
});
function GetUser() {
var response = $.ajax({
url: '/api/User',
method: 'GET',
contentType: 'application/json; charset=utf-8',
success: function (data) {
alert("Success!");
},
error: function (request, status, error) {
alert(error);
}
});
}
I tu jest mój kontroler:
namespace MyProject.Controllers.API
{
public class UserController : ApiController
{
// GET api/<controller>
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/<controller>/5
[HttpGet]
public string Get(int id)
{
return "value";
}
}
}
API Kontrolery są w ich własnym folderze (zwany "API") w moim folderze Controllers w moim projekt - dlatego przestrzeń nazw zawiera "API" na tym przykładowym kontrolerze.
Gdy używam F12 w przeglądarce, aby uchwycić żądania coraz wysłany, widzę, że moja rozmowa ma następującą informację:
Request URL: http://localhost:50035/api/User
Request Method: GET
Status Code: 404/Not Found
Teraz moje zrozumienie jest, że powinno to znaleźć API o nazwie UserController i znajdź funkcję za pomocą znacznika [HttpGet] bez żadnych argumentów, a następnie zwróć tablicę ciągów znaków ("wartość1", "wartość2"). Zamiast tego niczego nie znajduje.
Jako ostatnia uwaga, tu jest mój config routingu (i tak, to jest inicjowany na Global.asax):
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
UPDATE:
Na podstawie informacji zwrotnych mam dotychczas otrzymałem moją konfigurację Global.asax. It teraz wygląda następująco:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Teraz gdy zgłoszę mojej funkcji API, mam ... w toku. Nie zwraca komunikatu o powodzeniu. Po prostu wisi. Nie dostaję "sukcesu!" alarm.
Jaka jest kolejność rejestrowania tras w metodzie Global.asax Application_Start()? JEŚLI rejestrujesz trasy MVC przed rundami WebAPI, wtedy trasy APi zakończą się niepowodzeniem! –
Powielono problem, rejestrując trasy MVC _przed trasami WebApi. –
Jeśli umieścisz punkt przerwania w metodzie Get() kontrolera użytkownika, czy zostanie on trafiony? –