J'ai la route par défaut dans Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Je voulais pouvoir cibler une fonction spécifique, j'ai donc créé une autre route:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Donc, dans mon contrôleur, j'ai:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
L'appel .../api/records/bycategoryid/5
me donnera ce que je veux. Cependant, appeler .../api/records/1
me donnera l'erreur
Plusieurs actions correspondant à la demande ont été trouvées: ...
Je comprends pourquoi - les routes définissent simplement quelles URL sont valides, mais en ce qui concerne la correspondance des fonctions, les deux Get(int id)
et la ByCategoryId(int id)
correspondance api/{controller}/{id}
, ce qui confond le cadre.
Que dois-je faire pour que la route API par défaut fonctionne à nouveau et que je conserve celle avec {action}
? J'ai pensé à créer un contrôleur différent nommé RecordByCategoryIdController
pour correspondre à la route API par défaut, pour laquelle je demanderais .../api/recordbycategoryid/5
. Cependant, je trouve que c'est une solution «sale» (donc insatisfaisante). J'ai cherché des réponses à ce sujet et aucun tutoriel sur l'utilisation d'une route {action}
ne mentionne même ce problème.
la source
id
est facultatif, une URL comme/api/{part1}/{part2}
peut toujours entrer dans laDefaultApi
route si aucune action correspondante n'est trouvée pour laWithActionApi
route. Corrigez-moi si j'ai tort, s'il-vous plait.Vous pouvez résoudre votre problème à l'aide du routage d'attributs
Manette
URI dans jquery
Configuration de l'itinéraire
et votre routage par défaut fonctionne comme un routage basé sur les conventions par défaut
Manette
URI dans Jquery
Configuration de l'itinéraire
Examen article pour plus d' informations de routage d'attributs et onvention routage basé ici et ce
la source
Essaye ça.
la source
La raison possible peut également être que vous n'avez pas hérité de Controller d'ApiController. Arrivé avec moi a mis un certain temps à comprendre la même chose.
la source
Pour différencier les itinéraires, essayez d'ajouter une contrainte selon laquelle l'ID doit être numérique:
la source