5

我有一个添加了 elmah 的 MVC4 项目。我 global.asax 的 Application_Start() 有

WebApiConfig.Register(GlobalConfiguration.Configuration); // #1
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);   // #2

#1和#2如下

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "{controller}/{action}/{id}",
            defaults: new { id = RouteParameter.Optional } );
    }
    ...
}

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

模板是相同的,并且路由到控制器的工作方式完全符合我们的要求(从 URI 规范的角度来看)。问题是在添加 WebAPI 路由之后添加了忽略路由。因此,MVC4s 路由应该忽略并由 Elmah(例如/elmah.axd/styles)处理的内容被 WebAPI 拦截并且请求失败 => 所以我的 elmah.axd 页面中没有 CSS。我尝试在 global.asax 中翻转 #1 和 #2 但这导致所有 WebAPI 路由失败 - 比 CSS 在 Elmah 中不起作用更糟糕!

我基本上需要一些方法来指示 WebAPI 的路由忽略{resource}.axd/{*pathInfo}作为第一条路由 - 我该怎么做?

4

2 回答 2

8

这对我们有用 - 将忽略从包装中移出并作为第一个。

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        //ignore route first
        RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        // And taken out of the call below
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }
于 2012-11-21T06:25:30.183 回答
2

听起来您需要更好地控制路由定义的顺序。您可以直接在 global.asax.cs 中定义它们,而不是从单独的 RouteConfig 和 WebApiConfig 类中提取它们,如下所示:

RouteTable.Routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

GlobalConfiguration.Configuration.Routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "{controller}/{action}/{id}",
    defaults: new {id = RouteParameter.Optional});

RouteTable.Routes.MapRoute(
    name: "Default",
    url: "{controller}/{action}/{id}",
    defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
于 2012-11-20T16:29:06.367 回答