Всеобъемлющий маршрут не удается найти с помощью WebApi2 ApiController
-
21-12-2019 - |
Вопрос
Я создаю службу WebApi2, и один из методов, который я хочу реализовать, представляет собой HTTP GET из объекта во внутренней древовидной структуре - таким образом, запрос будет выглядеть следующим образом:
GET /values/path/path/to/object/in/tree
Поэтому я бы хотел, чтобы мой метод получал "путь/к/объекту/в/дереве".
Однако я просто получаю 404, когда запускаю это, и интересно, что я получаю 404, который отличается от стандартного IIS 404.Он озаглавлен "Ошибка сервера в "/"Приложении.", в то время как сообщение для полностью недопустимого ресурса озаглавлено "Ошибка HTTP 404.0 - Не найдено".
Я играю с шаблоном по умолчанию, чтобы попытаться посмотреть, смогу ли я заставить это работать, отсюда и сходство.
У меня есть это для моего RouteConfig
public static void RegisterRoutes(RouteCollection routes)
{
var route = routes.MapRoute(
name: "CatchAllRoute",
url: "values/path/{*pathValue}",
defaults: new { controller = "Values", action = "GetPath" });
}
И это мой 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;
}
}
Интересно, если я выведу из Controller
скорее, чем ApiController
это работает нормально, но тогда обычная маршрутизация атрибутов не работает.
Я попытался следовать методологии, описанной в этот пост (http://www.tugberkugurlu.com/archive/asp-net-web-api-catch-all-route-parameter-binding) но я не смог заставить это сработать.
Я уверен, что упускаю что-то до глупости простое, но, потратив на это несколько часов, я счел благоразумным спросить, что я делаю не так.
Спасибо
M
Решение
Маршрутизация по веб-api - это не то же самое, что маршрутизация MVC.вместо
route.MapRoute
пробовать
public static void Register(HttpConfiguration config) {
config.MapHttpAttributeRoutes
config.Routes.MapHttpRoute(
name: "CatchAll", routeTemplate: "values/path/{*pathvalue}",
defaults: new {id = RouteParameter.Optional });
}
Причина, по которой это работает с контроллера, заключается в том, что MapRoute - это правильный формат для маршрутизации контроллера MVC, в то время как MapHttpRoute предназначен для контроллеров API.