Ho un'applicazione MVC con poche pagine semplici che verranno eseguite principalmente su chiamate API Web. Per semplicità voglio includerli nello stesso progetto. Posso avviare e navigare nella mia pagina bene, ma quando provo a chiamare la mia API tramite Ajax continuo a ricevere un errore 404 - non riesce a trovare la funzione API.Impossibile chiamare il controller WebAPI tramite AJAX, quando è ospitato su MVC
Ecco il mio file 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);
}
});
}
e qui è il mio controller:
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";
}
}
}
L'API controller sono nella propria cartella (chiamata "API") dentro la mia cartella Controllers nella mia progetto - ecco perché lo spazio dei nomi contiene "API" su questo controller di esempio.
Quando uso F12 sul browser per catturare la richiesta di ottenere inviato, mi rendo conto che la mia chiamata ha le seguenti informazioni:
Request URL: http://localhost:50035/api/User
Request Method: GET
Status Code: 404/Not Found
Ora la mia comprensione è che questo dovrebbe trovare l'API con il nome UserController e trova la funzione con il tag [HttpGet] senza argomenti, quindi restituisce l'array di stringhe ("valore1", "valore2"). Invece non trova nulla.
Come nota finale, qui è il mio config di routing (e sì, è in fase di inizializzazione su 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:
Sulla base del feedback che ho ricevuto finora, ho spostato la mia configurazione Global.asax in giro. E 'ora assomiglia a questo:
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
GlobalConfiguration.Configure(WebApiConfig.Register);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
Ora, quando io chiamo la mia funzione API, ho ... in sospeso. Non restituisce un messaggio di successo. Si blocca. Non ho il "successo!" mettere in guardia.
Qual è l'ordine di registrazione dei percorsi nel metodo Global.asax Application_Start()? SE stai registrando percorsi MVC prima di WebAPI, allora le rotte API falliranno! –
Riprodotto il problema registrando rotte MVC _prima_Ravole WebApi. –
Se si inserisce un punto di interruzione nel metodo Get() del controller utente, viene colpito? –