web-dev-qa-db-ja.com

CSSおよびJSファイルがAsp.Net MVCルートをバイパスする理由

Asp.Net MVC4で構築されたプロトタイプアプリケーションを受け取りました。現在、NInject、ServiceLocatorなどを使用して、デフォルトのコントローラファクトリをカスタムファクトリに置き換えています。

問題は、デフォルトのコントローラーファクトリを置き換えることにより、JSファイルへのリクエストが、コントローラーとアクションに対する正当なリクエストであるかのように処理されることです。

したがって、Visual Studioで作成された既定のテンプレートを見ると、ルート構成は次のようになります。

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

それを見て、私は自分自身に質問しています。「/ Scripts/jquery.js」へのリクエストがAsp.Net MVCによって解釈されないのはなぜですか。つまり、「スクリプト」がコントローラであり、「jquery.js」がアクションであるとなぜ思わないのでしょうか。

コントローラーファクトリオーバーライドを無効にしてもプロジェクトは機能するので、デフォルトのファクトリがその種のチェックを担当しているとしか想定できません。これは、 "/ Scripts/jquery.js"がコントローラーファクトリに実際に渡されることを意味します。

誰かがそれに光を当てることができますか?

このような問題を回避するためにコントローラーファクトリーをオーバーライドする場合、どのような処理を行う必要がありますか?

26
Rodrigo Lira

もう少し調べてみたところ、スティーブンサンダーソンの本から次のような引用が見つかりました。

ただし、ルーティングシステムは引き続きファイルシステムをチェックして、着信URLがファイルまたはディスクと一致するかどうかを確認します。一致する場合、ルーティングは要求を無視します(URLのルートエントリをバイパスします)ファイルが直接提供されるように一致する場合もあります)。これは、画像、CSS、JavaScriptファイルなどの静的ファイルに非常に便利です。それらをプロジェクト(たとえば、/ Contentまたは/ Scriptフォルダー)に保持し、ルーティングをまったく使用していない場合と同じように、それらを直接参照して提供することができます。ファイルは純粋にディスク上に存在するため、ルーティング構成よりも優先されます。

代わりに、ルーティング構成をディスク上のファイルよりも優先させる場合は、RouteCollectionのRouteExistingFilesプロパティをtrueに設定できます。 (デフォルトではfalseです。)

それは非常に興味深いことであり、私を実際の問題に導きました。はるかに単純なもの。偶然にも、関連するスクリプトがフォルダに存在していませんでした。少なくとも、ビューで要求されたバージョンとまったく同じバージョンのものは必要ありません。これは、Asp.Net MVCがコントローラー/アクションリクエストであると見なす原因でした。

参照: http://forums.asp.net/t/1536510.aspx/1

19
Rodrigo Lira

MVCがjquery.jsへのリクエストを処理する方法が原因ではありませんIISがjquery.jsへのリクエストを処理する方法が原因です。IISは、そのようなリソースが.js、.jpgなどはすべて静的リソースであるため、ASP.NETエンジンを介して渡す必要はありません。これが発生しないようにするには、web.configに次の行を追加します。必要なパスIISはそのままにしておきます。

<system.webserver>
    <handlers>
    <add name="scripts" path="/Scripts/*" verb="GET" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>
    </handlers>
</system.webserver>

そのようなものを追加すると、JSファイルがIISを介して直接ではなくASP.NETを介して提供されるようになります。

32
ThaBigGuy