10

カスタム IHttpModules を作成しているときに、静的ファイル (.css および .js ファイルなど) の要求がマネージ モジュールにヒットしていることに気付きました。おそらく写真にも同じ問題があります。IIS は、ファイル システムに存在するファイルに対して 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 ThreadPool スレッドがその要求を処理していることを意味しますよね?

よろしく。

アップデート:

「runAllManagedModulesForAllRequests」を無効にしました。

<modules runAllManagedModulesForAllRequests="false">
      <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>

そして、すべてがうまく機能しているようですが、次の記事を見つけました: http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html "UrlRoutingModule-4.0 "空の前提条件を持つモジュール。

私のマシンでは、そのモジュールの追加はルート web.config にあり、すでに空の preCondition があります。

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>

だから今、私は少し混乱しています.このパラメータのステータスは何ですか? 私はそれを使うべきですか、それともすべきではありませんか?デフォルトで「true」になるのはなぜですか?

よろしく。

4

5 に答える 5

9

IIS が静的コンテンツに対して ASP.NET をバイパスする必要があるという事実についての最初の質問に答えます。

統合モードで構成されている場合、IIS 7.5 では、マネージ モジュールが、静的ファイルなど、従来 ASP.NET によって処理されない要求に関連するイベントを登録できるようになります。

これは IIS 7.5 クラシック モードでは発生しません。これは IIS 6 に似ており、管理対象モジュールが ASP.NET によって処理されない要求のイベントをリッスンすることを許可しません。

したがって、基本的runAllManagedModulesForAllRequests="true"に統合モードを使用している場合、マネージ モジュールにはすべての要求のイベントが通知されます。また、次のドキュメントからrunAllManagedModulesForAllRequests:

要求がマネージド コンテンツに対するものでなくても、すべてのマネージド モジュールがすべての要求を処理できる場合は True。それ以外の場合は false。

デフォルト値は false です。

ドキュメントでは、この属性がオプションとどのように相互作用するかについて説明していませんpreCondition。あなたが経験したことから、preCondition構成をオーバーライドしているように見えるので、他のモジュールの前提条件を空の文字列に変更して false への変更を回避することを意味する場合でも、そのままにfalseしてオプションを操作します。preConditionrunAllManagedModulesForAllRequests


更新: andの使用の影響に関するいくつかのドキュメントが見つかりましrunAllManagedModulesForAllRequestsた。既に述べたように、true の場合はpreConditionwith amanagedHandlerオプションのオーバーライドです。

ショートカットを使用して、「managedHandler」の前提条件に関係なく、アプリケーション内のすべての要求に対してすべてのマネージ (ASP.NET) モジュールを実行できるようにすることもできます。各モジュール エントリを構成して "managedHandler" 前提条件を削除せずに、すべてのマネージド モジュールをすべての要求に対して実行できるようにするには、次のセクションで runAllManagedModulesForAllRequests プロパティを使用します。

このプロパティを使用すると、"managedHandler" 前提条件は無効になり、すべてのマネージ モジュールがすべての要求に対して実行されます。

于 2011-12-07T16:06:47.367 に答える
6

私のマシンでは、そのモジュールの追加はルート web.config にあり、すでに空の preCondition があります

完全。つまり、拡張子のない URL を使用するため、MVC に必要なこのモジュールは常に実行されます。

だから今、私は少し混乱しています.このパラメータのステータスは何ですか? 私はそれを使うべきですか、それともすべきではありませんか?デフォルトで「true」になるのはなぜですか?

IIS7 SP1 および IIS7.5 SP1 では拡張子のない URL のサポートが新しくなったためです。IIS7 では、要求してインストールする必要があるパッチとして入手できます。あなたの質問に対する完全な回答がここにあります: http://support.microsoft.com/kb/980368

このパラメーターがデフォルトで true になるのはなぜですか? VS2010 は IIS7 SP1 より前に出荷されたためです。VS2010SP1 の新しい MVC プロジェクトでは false になっているのではないでしょうか?

于 2011-12-10T22:24:56.707 に答える
2

次のコードを書くことができます。

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-extension.aspx

于 2011-12-09T06:30:50.067 に答える
1

本当に無視したい場合は、丸括弧を使用しないでください。

routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("Scripts/{*pathInfo}");
于 2011-12-05T15:54:05.983 に答える
0

すべての静的ファイルのリストを無視するには、これを試してください

routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });
于 2015-07-14T21:09:26.310 に答える