J'ai besoin d'un contrôleur pour que JSON soit consommé par JavaScript. J'ai donc hérité de la classe ApiController
, mais il ne se comporte pas comme prévu. Le livre Apress Book Pro ASP.NET MVC 4 et la plupart des exemples en ligne que j'ai trouvés donnent des exemples tels que:
public class ServicesController : ApiController
{
public string[] MethodFruit()
{
return new string[] { "Apple", "Orange", "Banana" };
}
accessible via l'URL:
http://mysite/services/methodfruit
Mais cela ne fonctionne jamais - la ressource n'est pas trouvée. La seule approche que je peux utiliser est de faire en sorte que le contrôleur contienne une méthode différente pour chaque verbe HTTP, puis:
http://mysite/api/services
Ce qui appelle la méthode GET.
J'ai consulté le site Web d'Apress, mais ils ne semblent pas avoir de forum et le code source actuel est dans VS 2012, ce que je n'utilise pas. J'ai examiné les fichiers source et ils semblent penser que l'ancienne approche devrait fonctionner. L'ancienne approche n'est-elle plus prise en charge?
Oui ... vous devez généralement respecter la convention de dénomination par défaut attendue par l'API ASP.NET WEB.
Vérifiez ce document officiel:
Routage dans l'API Web ASP.NET
Si vous ne souhaitez pas suivre la convention, vous pouvez essayer la section Routing by Action Name décrite dans le document lié ci-dessus.
Routage par nom d'action
Avec le modèle de routage par défaut, Web API utilise la méthode HTTP pour sélectionnez l'action. Cependant, vous pouvez également créer un itinéraire où le Le nom de l'action est inclus dans l'URI:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } );
Dans votre cas, vous devriez faire ceci:
[HttpGet]
public string[] MethodFruit()
{
return new string[] { "Apple", "Orange", "Banana" };
}
Si vous souhaitez que l'API Web recherche le nom de l'action lors du routage, remplacez la classe WebApiConfig.cs du dossier App_Start par ceci:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Ensuite, vous pouvez simplement faire une demande GET à
http://mysite/api/Services/MethodFruit
Ajout d'informations supplémentaires sur la réponse ci-dessus. Ajouter RoutePrefix résoudrait parfois le problème. J'espère que ça aide
Manette
[RoutePrefix("api/Services")]
public class ServicesController : ApiController
{
[System.Web.Http.AcceptVerbs("GET", "POST")]
[System.Web.Http.HttpGet]
[Route("MethodFruit")]
public string[] MethodFruit()
{
return new string[] { "Apple", "Orange", "Banana" };
}
}
En config
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional } );
je faisais face au même problème, j'ai trouvé que sur mon code
using System.Web.Mvc;
j'ai importé Mvc au lieu d'utiliser System.Web.Http . Il utilisait donc le routage Mvc et non la route webApi ..__
using System.Web.Http
et cela fonctionne pour moi. J'ajoute ma réponse pour que les débutants ne répètent pas la même erreur