Coger: toda la ruta no encuentra la ruta con WEBAPI2 Apicontroller
-
21-12-2019 - |
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
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.