Roteamento da API da Web - api / {controller} / {action} / {id} "disfunctions" api / {controller} / {id}
Eu tenho a rota padrão no 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" };
}
Chamando.../api/records/bycategoryid/5
vai me dar o que eu quero. No entanto, chamando.../api/records/1
vai me dar o erro
Várias ações foram encontradas que correspondem à solicitação: ...
Eu entendo porque isso é - as rotas apenas definem quais URLs são válidas, mas quando se trata de correspondência de função, ambasGet(int id)
eByCategoryId(int id)
partidaapi/{controller}/{id}
que é o queconfunde o quadro.
O que preciso fazer para que a rota da API padrão funcione novamente e manter a rota com{action}
? Eu pensei em criar um controlador diferente chamadoRecordByCategoryIdController
para corresponder à rota da API padrão, para a qual gostaria de solicitar.../api/recordbycategoryid/5
. No entanto, acho que isso é uma solução "suja" (assim, insatisfatória). Eu procurei respostas sobre isso e nenhum tutorial sobre como usar uma rota com{action}
até menciona esta questão.