静的ファイルのリクエストは、ASP.NET MVC3で管理されたコードにヒットしています
-
28-10-2019 - |
質問
カスタムIHTTPMODULESを作成すると、静的ファイル(.CSSおよび.jsファイルなど)のリクエストが管理されたモジュールにヒットしていることに気付きました。おそらく写真には同じ問題があります。ファイルシステムに存在するファイルにasp.netをバイパスするべきではありませんか?
例えば:
public class MyModule:IHttpModule
{
public void Dispose(){ }
public void Init(HttpApplication context)
{
context.BeginRequest += (o, e) => Debug.Print("Request: " + HttpContext.Current.Request.RawUrl);
}
}
そして、私はそれをこのように宣言します:
<modules runAllManagedModulesForAllRequests="true">
<add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX"/>
</modules>
しかし、前提条件を使用しても、静的ファイルがモジュールをどのように通過するかを確認できます。
Request: /MVCX/
Request: /MVCX/Content/Site.css
Request: /MVCX/Scripts/jquery-1.4.4.min.js
静的ファイルのルールを無視しようとしましたが、違いはありません。
routes.IgnoreRoute("{Content}/{*pathInfo}");
routes.IgnoreRoute("{Scripts}/{*pathInfo}");
これはいつもですか?それとも私はここで何かが足りませんか?私の知る限り、静的ファイル要求にIISが回答する必要があるかどうか。私の管理されたモジュールがヒットしている場合、CLRスレッドプールスレッドがそのリクエストを処理していることを意味しますよね?
よろしく。
アップデート:
私は「ranallmanagedmodulesforallRequests」を無効にしました:
<modules runAllManagedModulesForAllRequests="false">
<add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>
そして、すべてがうまくいくように見えますが、私はこの記事を見つけました: http://www.britishdeveloper.co.uk/2010/06/dont-modules-runallmanagedmodulesfo.html これは、空の前提条件で「urlRoutingModule-4.0」モジュールを削除および読み取ることをお勧めします。
私は私のマシン、そのモジュールの追加がルートweb.configにあり、すでに空の前提条件があります:
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type machine.config | find "UrlRouting"
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type web.config | find "UrlRouting"
<add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>
だから今、私は少し混乱しています、このパラメーターのステータスは何ですか?使用する必要がありますか、それともすべきではありませんか?デフォルトで「真実」とするのはなぜですか?
よろしく。
解決
私は私のマシン、そのモジュールの追加がルートweb.configにあり、すでに空の前提条件があります
完全。つまり、このモジュールは常に実行されます。これは、拡張レスURLを使用するため、MVCに必要なものです。
だから今、私は少し混乱しています、このパラメーターのステータスは何ですか?使用する必要がありますか、それともすべきではありませんか?デフォルトで「真実」とするのはなぜですか?
なぜなら、拡張レスURLサポートはIIS7 SP1およびIIS7.5 SP1で新しいためです。 IIS7は、要求してインストールする必要があるパッチとして利用できます。あなたはあなたの質問に対する完全な答えでここにそれを見つけるでしょう:http://support.microsoft.com/kb/980368
このパラメーターがデフォルトで真実になるのはなぜですか? vs2010はiis7 sp1の前に出荷されたためです。 VS2010SP1の新しいMVCプロジェクトでは、Falseになっているのでしょうか?
他のヒント
IISが静的コンテンツのためにASP.NETをバイパスする必要があるという事実に関する最初の質問に答える。
統合モードで構成されている場合、IIS 7.5は、静的ファイルのように、ASP.NETによって伝統的に処理されていないリクエストに関連するイベントにマネージモジュールを登録できます。
これはIIS 7.5クラシックモードでは発生しません。これはIIS 6に似ており、管理されたモジュールがASP.NETによって処理されないリクエストでイベントをリッスンすることはできません。
だから、基本的にあなたが持っているなら runAllManagedModulesForAllRequests="true"
統合モードでは、マネージドモジュールには、リクエストごとにイベントが通知されます。また、から ドキュメンテーション runAllManagedModulesForAllRequests
:
すべての管理されたモジュールが、マネージドコンテンツに対してリクエストがなかったとしても、すべての要求を処理できる場合はtrue。それ以外の場合、false。
デフォルト値はfalseです。
ドキュメントは、この属性がどのように相互作用するかを説明していません preCondition
オプション。あなたが経験したことから、それを無効にするようです preCondition
構成なので、もしあなただったら、私はそれを残します false
と一緒に作業します preCondition
他のモジュールを変更することを意味する場合でもオプション空の文字列に前提条件を変更して、の変更を回避します runAllManagedModulesForAllRequests
偽り。
アップデート: いくつかのドキュメントを見つけました の使用の意味について runAllManagedModulesForAllRequests
そして、すでに述べたように、本当なら、 preCondition
とともに managedHandler
オプション。
ショートカットを使用して、「Managedler」の前提条件に関係なく、すべてのマネージド(ASP.NET)モジュールがアプリケーション内のすべてのリクエストに対して実行できるようにすることもできます。各モジュールエントリを構成して「マネージドハンドラー」の前提条件を削除することなく、すべてのリクエストに対してすべてのマネージモジュールが実行できるようにするには、セクションのRunallManagedModulesForAllRequestsプロパティを使用します。
このプロパティを使用すると、「ManageDler」の前提条件には効果がなく、すべてのマネージモジュールがすべてのリクエストに対して実行されます。
次のコードを書くことができます。
routes.IgnoreRoute("{*allcss}", new { allaspx = @".*\.css(/.*)?" });
routes.IgnoreRoute("{*alljs}", new { allaspx = @".*\.js(/.*)?" });
以下のリンクの詳細をご覧ください
http://haacked.com/archive/2008/07/14/make-routing-ignore-requests-for-a-file-extion.aspx
あなたが本当に無視したいなら、あなたは湾曲したブラケットを使用しないでください:
routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("Scripts/{*pathInfo}");
これを試して、すべての静的ファイルのリストを無視してください
routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });