Web API 2 文字段路由失败
Web API 2 routing fails for literal segment
我遇到了 Web API 2 文字段路由问题。
在一个项目中,我有ASP.NET MVC和API2 运行在一起,该项目也是运行 MVC领域。
每个区域下都有API个文件夹,里面有API个。我在尝试请求以下 url 时遇到问题:
{主机}/accesscontrol/api/reporting/bookings.
- accesscontrol这里是区名
- 举报是控制者
- bookings 是文字段。
我遇到的错误:
在控制器 'Reporting' 上找不到符合请求的操作。
这是应该接收此请求的控制器:
[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 段是否存在,请求都运行良好。
这是区域注册下路由的配置class:
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 }
);
}
如何让应用程序理解区域下的那些文字段?
编辑
我在Global.asax.cs文件中调用RegisterAllAreas
,如下:
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);
}
}
我设法让它工作,只需在您的 MapHttpRoute 中的控制器之后添加操作并将 [Route("bookings")] 属性更改为 [ActionName("bookings")] 并且一切正常。
context.Routes.MapMvcAttributeRoutes();
context.Routes.MapHttpRoute(
"AccessControlApi_default",
"Accesscontrol/api/{controller}/{action}/{id}",
new { id = RouteParameter.Optional});
希望对您有所帮助。
我通过将 AreaRegistration.RegisterAllAreas();
从 global.asax.cs 文件移动到 RouteConfig.cs 解决了我的问题文件。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
AreaRegistration.RegisterAllAreas();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] {"WebPortal.Controllers"}
);
}
}
我遇到了 Web API 2 文字段路由问题。
在一个项目中,我有ASP.NET MVC和API2 运行在一起,该项目也是运行 MVC领域。
每个区域下都有API个文件夹,里面有API个。我在尝试请求以下 url 时遇到问题: {主机}/accesscontrol/api/reporting/bookings.
- accesscontrol这里是区名
- 举报是控制者
- bookings 是文字段。
我遇到的错误: 在控制器 'Reporting' 上找不到符合请求的操作。
这是应该接收此请求的控制器:
[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 段是否存在,请求都运行良好。
这是区域注册下路由的配置class:
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 }
);
}
如何让应用程序理解区域下的那些文字段?
编辑
我在Global.asax.cs文件中调用RegisterAllAreas
,如下:
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);
}
}
我设法让它工作,只需在您的 MapHttpRoute 中的控制器之后添加操作并将 [Route("bookings")] 属性更改为 [ActionName("bookings")] 并且一切正常。
context.Routes.MapMvcAttributeRoutes();
context.Routes.MapHttpRoute(
"AccessControlApi_default",
"Accesscontrol/api/{controller}/{action}/{id}",
new { id = RouteParameter.Optional});
希望对您有所帮助。
我通过将 AreaRegistration.RegisterAllAreas();
从 global.asax.cs 文件移动到 RouteConfig.cs 解决了我的问题文件。
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
AreaRegistration.RegisterAllAreas();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new[] {"WebPortal.Controllers"}
);
}
}