Eu tenho a rota padrão em Global.asax:
RouteTable.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Eu queria ser capaz de direcionar uma função específica, então criei outra rota:
RouteTable.Routes.MapHttpRoute(
name: "WithActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = System.Web.Http.RouteParameter.Optional }
);
Então, no meu controlador, eu tenho:
public string Get(int id)
{
return "object of id id";
}
[HttpGet]
public IEnumerable<string> ByCategoryId(int id)
{
return new string[] { "byCategory1", "byCategory2" };
}
Ligar .../api/records/bycategoryid/5
vai me dar o que eu quero. No entanto, ligar .../api/records/1
me dará o erro
Foram encontradas várias ações que correspondem à solicitação: ...
Eu entendo o porquê - as rotas apenas definem quais URLs são válidos, mas quando se trata de correspondência de função, tanto Get(int id)
e ByCategoryId(int id)
correspondência api/{controller}/{id}
, que é o que confunde a estrutura.
O que preciso fazer para que a rota padrão da API funcione novamente e manter aquela com {action}
? Pensei em criar um controlador diferente nomeado RecordByCategoryIdController
para corresponder à rota de API padrão, para o qual eu solicitaria .../api/recordbycategoryid/5
. No entanto, considero que é uma solução "suja" (portanto insatisfatória). Procurei respostas sobre isso e nenhum tutorial por aí sobre como usar uma rota com {action}
sequer menciona esse problema.