【问题标题】:Web API 2 routing fails for literal segment文字段的 Web API 2 路由失败
【发布时间】:2015-07-01 03:49:56
【问题描述】:

我遇到了文字段的 Web API 2 路由问题。

在一个项目中,我有 ASP.NET MVC 和 WebAPI2 一起运行,该项目也在运行 MVC 领域。

在每个区域下,都有一个包含 API 的 API 文件夹。尝试请求以下网址时遇到问题: {host}/accesscontrol/api/reporting/bookings

  • accesscontrol这里是区域名称
  • 报告是控制者
  • 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 }
    );
}

如何让应用理解区域下的那些文字片段?

编辑

我在 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);
    }
}

【问题讨论】:

  • 您可以尝试将“[Route("bookings")]”编辑为“[Route("bookings/{q?}")]”,看看是否有什么不同?
  • @valentin 我试过了,同样的错误结果!

标签: asp.net-mvc asp.net-web-api2 asp.net-mvc-areas asp.net-web-api-routing asp.net-mvc-5.2


【解决方案1】:

我设法让它工作,只需在 MapHttpRoute 中的控制器之后添加操作并将 [Route("bookings")] 属性更改为 [ActionName("bookings")] 并且一切正常。

  context.Routes.MapMvcAttributeRoutes();

  context.Routes.MapHttpRoute(
      "AccessControlApi_default",
      "Accesscontrol/api/{controller}/{action}/{id}",
      new { id = RouteParameter.Optional});

希望对你有所帮助。

【讨论】:

  • 我读过它,它完全适用。我不知道问题出在哪里。
  • 尝试将其添加到您的 RegisterArea context.Routes.MapMvcAttributeRoutes(); 这将启用属性路由。
  • 我做了,我在所有其他映射代码之前添加了它,但错误结果相同!
  • 我尝试创建自己的项目,似乎一切正常,直到我注意到您正在创建自己的注册类。我认为这个问题已经在here 中得到了回答。
  • @AlBaraa Sh,我设法让它工作,我修改了我的答案。希望对你有帮助。
【解决方案2】:

我通过将: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"}
        );
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 2018-08-25
    • 1970-01-01
    • 2018-03-24
    相关资源
    最近更新 更多