對靜態文件的請求正在訪問 ASP.NET MVC3 中的託管程式碼
創建自定義 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”前置條件無效,並且所有託管模組都會針對所有請求執行。