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.