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.