Всеобъемлющий маршрут не удается найти с помощью WebApi2 ApiController

StackOverflow https://stackoverflow.com//questions/21044717

Вопрос

Я создаю службу 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top