![](/img/trans.png)
[英]Subscribing to HttpApplication events inside HttpModules behave differently between Integrated and Classic mode
[英]httpmodules(Classic Mode) Vs Modules (Integrated mode) not parsing request in the same way
我有一個ASP.NET FW 4.5應用程序,通常它在經典模式下運行,我們使用一個HttpModule來解析每個網頁請求。 如果用戶有權訪問,模塊將檢查數據庫。 沒問題。
當我們切換到集成模式時,我們按照遷移指南中的建議放置<webserver> <module>。 問題是該模塊正在解析對應用程序的每個請求,也包括css,jss和images。 在經典模式下,這不會發生,只會解析頁面。 經典和集成之間有不同的行為嗎? 該模塊實現如下方法: private void OnBeginRequest(object sender, EventArgs e) private void OnAuthorization(object sender, EventArgs e)
這個問題有點舊,但萬一其他人發現它我會提供答案......
在集成模式下,除非通過preCondition
屬性添加約束,否則將為每個IIS請求(包括非ASP.NET頁面)調用<system.webserver>
中提供的任何模塊。 例如
<system.webserver>
<modules>
<add preCondition="managedHandler" name="..." type="..."/>
</modules>
</system.webserver>
指定managedHandler
意味着將僅為.aspx
文件等ASP.Net托管資源調用模塊,但不調用html,圖像和javascript等非托管資源。
但是,請注意,如果在<modules>
元素上指定runAllManagedModulesForAllRequests="true"
,則會覆蓋此設置,這會導致所有模塊(以及您的Global.asax
類,如果存在)通知所有請求。
在MSDN上有一個有用的IIS 7.x請求生命周期的記錄,但是這沒有提到preCondition
屬性。 但是,您可以在IIS設置架構文檔中閱讀它。
您可能想知道在未調用Global.asax
文件中定義的事件處理程序時,如何為非托管資源調用模塊。 畢竟,模塊使用HttpApplication
對象注冊它們的事件處理程序,該對象傳遞給IHttpModule.Init
方法,如下所示:
public void Init(System.Web.HttpApplication context)
{
context.AuthenticateRequest += my_request_handler;
}
傳遞給Init
的HttpApplication
與Global.asax
中定義的相同,那么為什么不調用全局應用程序事件處理程序呢? 答案很簡單,當一個模塊用HttpApplication
對象注冊它的事件處理程序時, HttpApplication
知道它處於模塊初始化模式,並分別注冊事件處理程序,以及指示是否應該為非調用事件處理程序的標志。管理資源。 您可以通過查看HttpApplication參考源代碼進一步調查。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.