簡體   English   中英

httpsodules(經典模式)Vs模塊(集成模式)不以相同方式解析請求

[英]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設置架構文檔中閱讀它。

TL; DR

您可能想知道在未調用Global.asax文件中定義的事件處理程序時,如何為非托管資源調用模塊。 畢竟,模塊使用HttpApplication對象注冊它們的事件處理程序,該對象傳遞給IHttpModule.Init方法,如下所示:

public void Init(System.Web.HttpApplication context)
{
    context.AuthenticateRequest += my_request_handler;
}

傳遞給InitHttpApplicationGlobal.asax中定義的相同,那么為什么不調用全局應用程序事件處理程序呢? 答案很簡單,當一個模塊用HttpApplication對象注冊它的事件處理程序時, HttpApplication知道它處於模塊初始化模式,並分別注冊事件處理程序,以及指示是否應該為非調用事件處理程序的標志。管理資源。 您可以通過查看HttpApplication參考源代碼進一步調查。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM