web-dev-qa-db-fra.com

Route de l'API Web vers le nom de l'action

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?

13
David

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" };
}
29
Leniel Maccaferri

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
7
Mahesh

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 } );
5
Praveen M P

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

0
Uttam Ughareja