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" };
}
Appel à .../api/records/bycategoryid/5
me donnera ce que je veux. Cependant, appeler .../api/records/1
me donnera l'erreur
Plusieurs actions ont été trouvées qui correspondent à la demande : ...
Je comprends pourquoi - les routes définissent simplement quelles URL sont valides, mais lorsqu'il s'agit de faire correspondre des fonctions, les deux types d'URL ne sont pas valides. Get(int id)
y ByCategoryId(int id)
match api/{controller}/{id}
qui est ce que confond le cadre.
Que dois-je faire pour que la route API par défaut fonctionne à nouveau, et garder 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 je n'ai trouvé aucun tutoriel sur l'utilisation d'une route avec le protocole {action}
ne mentionne même pas cette question.