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.

我遇到的错误: 在控制器 '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"}
        );
    }
}