静的ファイルのリクエストは、ASP.NET MVC3で管理されたコードにヒットしています

StackOverflow https://stackoverflow.com/questions/8387427

質問

カスタム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)(/.*)?" });
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top