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 ルーティングが失敗しました。Elmah で CSS が機能しないよりもはるかに悪いです。

基本的に{resource}.axd/{*pathInfo}、最初のルートとして正しく無視するようにWebAPIのルーティングに指示する方法が必要です-どうすればそれを行うことができますか?

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

ルート定義の順序をより細かく制御する必要があるようです。これらを個々のRouteConfigクラスとWebApiConfigクラスから取得する代わりに、次のようにglobal.asax.csで直接定義できます。

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 に答える