A rota pega-tudo não consegue encontrar a rota com WebApi2 ApiController
-
21-12-2019 - |
Pergunta
Estou criando um serviço WebApi2 e um dos métodos que desejo implementar representa um HTTP GET de um objeto dentro de uma estrutura de árvore interna - portanto, a solicitação seria semelhante a:
GET /values/path/path/to/object/in/tree
Então, eu gostaria que meu método recebesse "caminho/para/objeto/em/árvore".
No entanto, recebo um 404 quando executo isso, e é interessante que recebo um 404 diferente do IIS 404 padrão.É intitulado 'Erro de servidor no aplicativo '/'.', enquanto aquele para um recurso completamente inválido é intitulado 'Erro HTTP 404.0 - Não encontrado'.
Estou brincando com o modelo padrão para tentar ver se consigo fazer isso funcionar, daí a semelhança.
Eu tenho isso para meu RouteConfig
public static void RegisterRoutes(RouteCollection routes)
{
var route = routes.MapRoute(
name: "CatchAllRoute",
url: "values/path/{*pathValue}",
defaults: new { controller = "Values", action = "GetPath" });
}
E este é o meu ValuesController
:
[System.Web.Mvc.AuthorizeAttribute]
[RoutePrefix("values")]
public class ValuesController : ApiController
{
[Route("test/{value}")]
[HttpGet]
public string Test(string value)
{
return value;
}
[HttpGet]
public string GetPath(string pathValue)
{
return pathValue;
}
}
Curiosamente, se eu derivar de Controller
em vez de ApiController
funciona bem, mas o roteamento normal de atributos não funciona.
Tentei seguir a metodologia em esta postagem (http://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding) mas não consegui fazê-lo funcionar.
Tenho certeza de que estou perdendo algo estupidamente fácil, mas depois de passar algumas horas nisso, achei prudente perguntar o que estou fazendo de errado.
Obrigado
M
Solução
O roteamento da API da Web não é o mesmo que o roteamento MVC.em vez de
route.MapRoute
tentar
public static void Register(HttpConfiguration config) {
config.MapHttpAttributeRoutes
config.Routes.MapHttpRoute(
name: "CatchAll", routeTemplate: "values/path/{*pathvalue}",
defaults: new {id = RouteParameter.Optional });
}
A razão pela qual funciona no controlador é que MapRoute é o formato correto para rotear um controlador MVC, enquanto MapHttpRoute é projetado para controladores API.