Это происходит потому, что у вас есть 2 конфигурации маршрута, один для MVC
контроллеров и один для Web API
.И в вашем случае Web API
настройка маршрута идет первым.Global.asax.cs
выглядит следующим образом
//some configs
WebApiConfig.Register(GlobalConfiguration.Configuration);
//some configs
RouteConfig.RegisterRoutes(RouteTable.Routes);
И у вас должно быть что-то подобное в Web API
route config
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Когда вы запрашиваете /api/Manage/TestOne
, применяется Web API
маршрутизацияпервый.Маршрут на основе атрибутов не подходит, но запрос полностью соответствует маршруту DefaultApi
.Manage
соответствует {controller}
, а TestOne
- {id}
.Таким образом, фреймворк начинает поиск контроллера API с именем Manage
вот так
public class ManageController : ApiController
Но такого контроллера нет, и действительно у вас есть ошибка
{
"Message": "No HTTP resource was found that matches the request URI 'http://host/api/Manage/TestOne/?value1=foo&value2=bar'.",
"MessageDetail": "No type was found that matches the controller named 'Manage'."
}
Так что я могу предложить вамнесколько возможных решений.
Изменить порядок конфигурации маршрута
//some configs
RouteConfig.RegisterRoutes(RouteTable.Routes);
//some configs
WebApiConfig.Register(GlobalConfiguration.Configuration);
И тогда ваш пример будет работать, как и ожидалось, но он может привести к неожиданным ошибкам, потому что я не знаю всехвозможные маршруты в вашем приложении.
Удалить DefaultApi
route
Если вы полностью полагаетесь на маршрутизацию на основе атрибутов для Web API
, вы можете просто удалить эту конфигурацию без отрицательныхэффект для вашего приложения
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Или просто измените префикс
Если вы измените префикс с api
на что-то еще, он будет работать, потому что он не будетматч DefaultApi
маршрут больше
[RoutePrefix("view/Manage")]