Pregunta

Estoy creando un servicio WEBAPI2, y uno de los métodos que quiero implementar representa un HTTP obtener de un objeto dentro de una estructura de árbol interna, por lo que la solicitud sería a lo largo de las líneas de:

GET /values/path/path/to/object/in/tree

Por lo tanto, quisiera que mi método reciba "ruta / a / objeto / en / árbol".

Sin embargo, solo obtendré un 404 cuando ejecuto esto, y es interesante que obtenga un 404 que sea diferente que busca la IIS estándar 404. Es titulado 'Error del servidor en' / 'Aplicación', mientras que la única para Un recurso completamente no válido se titula 'http error 404.0 - no encontrado'.

Estoy jugando con la plantilla por defecto para intentar ver si puedo hacer que esto funcione, de ahí la similitud.

Tengo esto para mi RouteConfig

public static void RegisterRoutes(RouteCollection routes)
{
    var route = routes.MapRoute(
               name: "CatchAllRoute",
                url: "values/path/{*pathValue}",
                defaults: new { controller = "Values", action = "GetPath" });
}

y este es mi 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, si obme que se deriva de Controller en lugar de ApiController, funciona bien, pero luego el enrutamiento de atributos normales no funciona.

Intenté seguir la metodología en >> Esta publicación (http://www.tugberkugurlu.com/archive/asp-net-web-api-atch-all-route-parameter-binding) pero no pude ponerlo en funcionamiento.

Estoy seguro de que me falta algo estúpidamente fácil, pero después de haber pasado algunas horas, pensé que era prudente preguntar qué estoy haciendo mal.

gracias

m

¿Fue útil?

Solución

El enrutamiento de API web no es lo mismo que el enrutamiento MVC.en lugar de

route.MapRoute

try

public static void Register(HttpConfiguration config) {
    config.MapHttpAttributeRoutes

    config.Routes.MapHttpRoute(
        name: "CatchAll", routeTemplate: "values/path/{*pathvalue}", 
        defaults: new {id = RouteParameter.Optional });
}

La razón por la que funciona desde el controlador es que Maproute es el formato correcto para enrutar un controlador MVC, mientras que MAPHTTPROUTE está diseñado para los controladores API.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top