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.
fonte
id
for opcional, o URL like/api/{part1}/{part2}
ainda pode entrar naDefaultApi
rota se nenhuma ação correspondente for encontrada para aWithActionApi
rota. Por favor me corrija se eu estiver errado.Você pode resolver seu problema com a ajuda de roteamento de atributo
Controlador
URI em jquery
Configuração de rota
e seu roteamento padrão está funcionando como roteamento baseado em convenção padrão
Controlador
URI em Jquery
Configuração de rota
Revise o artigo para obter mais informações Roteamento de atributo e roteamento baseado em convenção aqui e isto
fonte
Experimente isso.
fonte
A possível razão também pode ser que você não herdou o Controller de ApiController. Aconteceu comigo demorou um pouco para entender o mesmo.
fonte
Para diferenciar as rotas, tente adicionar uma restrição de que o id deve ser numérico:
fonte