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

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top