Я столкнулся с проблемой маршрутизации Web API 2 для литеральных сегментов.
В одном проекте у меня есть ASP.NET MVC и WebAPI2, работающие вместе, проект также использует области MVC.
В каждой области есть папка API, содержащая API. Я столкнулся с проблемой при попытке запросить следующий URL-адрес: {host}/accesscontrol/api/reporting/bookings.
- управление доступом здесь имя области
- отчетность является контролером
- бронирования — это буквальный сегмент.
Я получаю сообщение об ошибке: Для контроллера «Отчетность» не найдено действие, соответствующее запросу.
Это контроллер, который должен получить этот запрос:
[RoutePrefix("accesscontrol/api/reporting")]
public class ReportingController : ApiController
{
[Route("bookings")]
[ResponseType(typeof(Booking))]
[HttpGet]
public async Task<IHttpActionResult> Bookings(string q = null)
{
//Code to get data
return Ok(bookings);
}
}
Когда я удаляю атрибут [Route('Bookings')]
, запрос работает хорошо, независимо от того, есть ли там сегмент Bookings или нет.
Это конфигурация маршрутизации в классе регистрации области:
public override void RegisterArea(AreaRegistrationContext context)
{
context.Routes.MapHttpRoute(
"AccessControlApi_default",
"accesscontrol/api/{controller}/{id}",
new { id = RouteParameter.Optional }
);
context.MapRoute(
"AccessControl_default",
"accesscontrol/{controller}/{action}/{id}",
new { action = "Index", id = UrlParameter.Optional }
);
}
Как я могу позволить приложению понимать эти буквальные сегменты под областями?
Редактировать
Я вызываю RegisterAllAreas
в файле Global.asax.cs следующим образом:
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
GlobalConfiguration.Configure(WebApiConfig.Register);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}