Asp.net-Mvc

對靜態文件的請求正在訪問 ASP.NET MVC3 中的託管程式碼

  • July 14, 2015

創建自定義 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 中,並且它已經有一個空的前置條件:

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 中,並且它已經有一個空的前置條件

完美的。這意味著該模組將始終執行,這是 MVC 所需的,因為它使用無副檔名 url。

所以現在我有點困惑,這個參數的狀態是什麼?我應該使用它還是不應該使用它?為什麼預設情況下它是“真實的”?

因為無擴展 url 支持在 IIS7 SP1 和 IIS7.5 SP1 中是新的。它可用於 IIS7 作為您必須請求和安裝的更新檔程序。您可以在這裡找到問題的完整答案:http: //support.microsoft.com/kb/980368

為什麼這個參數預設為真?因為 VS2010 是在 IIS7 SP1 之前發布的。也許它在 VS2010SP1 的新 MVC 項目中是錯誤的?

回答關於 IIS 應該繞過 ASP.NET 獲取靜態內容這一事實的第一個問題。

如果在集成模式下配置,IIS 7.5 將允許託管模組註冊與傳統上不由 ASP.NET 處理的請求相關的事件,例如靜態文件。

這在 IIS 7.5 經典模式中不會發生,該模式類似於 IIS 6,並且不允許託管模組偵聽未由 ASP.NET 處理的請求中的事件。

因此,基本上,如果您runAllManagedModulesForAllRequests="true"使用集成模式,那麼您的託管模組將收到每個請求的事件通知。另外,從文件中runAllManagedModulesForAllRequests

如果所有託管模組都可以處理所有請求,則為真,即使該請求不是針對託管內容的;否則為假。

預設值為假。

文件沒有解釋此屬性如何與preCondition選項互動。根據您的經驗,它似乎覆蓋了preCondition配置,所以如果您是我,我會將其保留在原處false並僅使用preCondition選項,即使這意味著將其他模組的先決條件更改為空字元串以解決更改runAllManagedModulesForAllRequests為 false 的問題。


更新: 找到了一些關於使用的影響的文件,runAllManagedModulesForAllRequests並且如前所述,如果為真,是對preConditionwithmanagedHandler選項的覆蓋。

您還可以使用快捷方式來啟用所有託管 (ASP.NET) 模組以針對應用程序中的所有請求執行,而不管“managedHandler”前提條件如何。要使所有託管模組能夠針對所有請求執行,而無需配置每個模組條目以刪除“managedHandler”前置條件,請使用以下部分中的 runAllManagedModulesForAllRequests 屬性:

當您使用此屬性時,“managedHandler”前置條件無效,並且所有託管模組都會針對所有請求執行。

引用自:https://stackoverflow.com/questions/8387427