MVC 4.5 Web API Routing не работает?

1-й маршрут работает.

например api/Shelves/SpaceTypes/1

2-й маршрут не работает. Я получаю ошибку нескольких действий.

например api/Shelves/1

Q) почему?

Это мои маршруты:

config.Routes.MapHttpRoute(
    "DefaultApiWithAction",
    "api/{controller}/{action}/{id}"
);

config.Routes.MapHttpRoute(
    "DefaultApiWithId",
    "api/{controller}/{id}",
    null,
    new { id = @"\d+" }
);

Это мой контроллер:

public HttpResponseMessage Get(int id)
{
     ...
}

[ActionName("SpaceTypes")]
public HttpResponseMessage GetSpaceTypes(int id)
{
     ...
}

5 ответов

Решение

Для MVC 4.5 это единственное что работает

В настоящее время есть ошибка по этому поводу.

Для того, чтобы ваш роутинг работал, нужно выполнить следующую работу

api/Shelves/ //Get All Shelves
api/SpaceTypes/1 //Get Shelf of id 1
api/Shelves/1/SpaceTypes/  //Get all space types for shelf 1

вам нужно сделать следующее.

Измените ваш маршрут на. (Обратите внимание на действие по умолчанию..)

config.Routes.MapHttpRoute(
    name : "DefaultAPi",
    routeTemplate : "api/{controller}/{id}/{action}",
    defaults: new {id= RouteParameter.Optional, 
    action = "DefaultAction"}
);

В вашем контроллере измените базовые методы на

[ActionName("DefaultAction")]
public string Get()
{
}

[ActionName("DefaultAction")]
public string Get(int id)
{
}

[ActionName("SpaceTypes")]
public string GetSpaceTypes(int id)
{
}

Теперь все должно работать как положено..

Спасибо Кипу Страйторсту за полное объяснение

У меня была похожая проблема, и я обнаружил, что не вызывал метод MapHttpAttributeRoutes в моем WebApiConfig...

надеюсь, это поможет, Дэвид

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

@ Кристоф почти прав. Вы должны сделать свой второй маршрут:

config.Routes.MapHttpRoute(
    "DefaultApiWithId", 
    "api/{controller}/{id}",
    new { action = "Get" },
    new { id = @"\d+ }
    );

Этот маршрут не знает, к какому действию привязать:

config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+" });

Оба ваших метода являются подходящим кандидатом.
Я не уверен на 100%, каковы ваши настройки, но в обычном REST каждый ресурс имеет контроллер, кажется, что у вас есть 1 контроллер с 2 ресурсами.
Чтобы заставить его работать в этой настройке, вы можете принудительно настроить второй путь к действию get, например так:

 config.Routes.MapHttpRoute("DefaultApiWithId", "api/{controller}/{id}", null, new { id = @"\d+", action="Get" });

Убедитесь, что в файле Global.asx вашего проекта вы добавили

WebApiConfig.Register(GlobalConfiguration.Configuration);

в функцию Application_Start.

Другие вопросы по тегам