Atributo de Roteamento Comportamento Estranho em ApiController
-
22-12-2019 - |
Pergunta
Eu estou usando o atributo de roteamento para especificar minhas rotas em um controlador que herda do Sistema.Da Web.Http.ApiController.Eu estou ficando um pouco de funk comportamento.Veja um exemplo de código:
[RoutePrefix("api/1/user")]
public class UserRestController : ApiController
{
UserService userService = new UserService();
[Route("{id}"), HttpGet]
public UserDTO Get(string id)
{
var user = userService.GetUserById(id);
return user;
}
}
Que funciona absolutamente como seria de esperar.Quando eu visitar o ~/api/1/user/someId eu recebo as informações esperadas de volta.Quando eu mudar para não incluir a '1' o prefixo da rota, recebo Nenhum recurso de HTTP verificou-se que corresponda ao pedido URI "baseUrl/api/user/someId'."
Eu tenho mvc rotas, web api rotas e atributo de todas as rotas de serem registradas no aplicativo inicie neste projecto, mas eu acho que as rotas padrão para este controlador seria ~/userrest/...então, eu não acho registrar esses seriam a causa disso, mas eu poderia estar errado.
Exemplo do que eu quero:
[RoutePrefix("api/user")]
public class UserRestController : ApiController
{
UserService userService = new UserService();
[Route("{id}"), HttpGet]
public UserDTO Get(string id)
{
var user = userService.GetUserById(id);
return user;
}
}
Eu esperaria que ~/api/user/someId funcionaria no entanto recebo a mensagem de erro mencionada acima ("Não HTTP recurso foi encontrado que coincide com o URI do pedido 'baseUrl/api/user/someId'.").
Cheio de erro em xml:
<Error>
<Message>
No HTTP resource was found that matches the request URI
'baseUrl/api/user/someId';.
</Message>
<MessageDetail>
No type was found that matches the controller named 'user'.
</MessageDetail>
</Error>
Solução
Com base na sua descrição de erro, você parece ter registrado convencional rotas antes de chamar MapHttpAttributeRoutes.Por exemplo, você pode ter uma rota de como config.Routes.MapHttpRoute("DefaultApi", "api/{controller}/{id}"...)
.Neste caso, a solicitação, como api/user/someid
gostaria de corresponder a esse percurso e a Web API poderia estar procurando por um controlador do tipo UserController
.Certifique-se de chamar MapHttpAttributeRoutes
antes desta rota convencional.
Regra básica:mais rotas específicas deve ser registrada antes do menos específicos ou genéricos rotas.