簡體   English   中英

高級:在應用程序生命周期內調用HttpModule Init()方法多少次?

[英]Advanced: How many times does HttpModule Init() method get called during application's life?

Web應用程序初始化如下:

  1. 正如我們所知,IIS收到特定Asp.net應用程序資源的第一個請求時,IIS會創建一個HttpApplication實例(在global.asax隱藏中定義)。
  2. 創建此新實例時,會進行初始化,同時檢查所有已配置的HTTP模塊。
  3. 然后將所有模塊實例化並放入應用程序的Modules集合中(類型為HttpModuleCollection
  4. 模塊循環並調用它們的Init()方法(當它們注冊請求事件時)

據我所知,上面的場景發生在Web應用程序啟動/初始化時(因此應用程序啟動事件)。

模塊會發生什么?

當Web應用程序處於活動狀態時,它們是否(重新)在每個請求上實例化,或者在每個連續請求中從Modules屬性重用? 據我了解IIS和Asp.net,它們在Web應用程序的整個生命周期中被重用。

如果它們被重用,我們可以假設它們的Init()方法實際上是應用程序啟動事件的偽事件處理程序嗎? 問題是我們無法附加到http模塊中的應用程序級別事件。 但是如果它們被重用,我們可以使用Init()作為應用程序啟動事件,並執行我們放在global.asax任何內容。

我們可以假設模塊的Init()方法在應用程序啟動事件時調用嗎? 我們可以使用這個假設來注冊我們無法改變global.asax隱藏的應用程序的路由嗎? web.config通常是可訪問的,我們可以按照我們想要的方式更改它。
這實際上有用嗎?

附加信息

我們可以檢查HttpApplication代碼並檢查它的InitModulesCommon()方法。 這個實際上調用了每個注冊的HTTP模塊的Init() 更有趣的是,此方法僅由InitIntegratedModules()InitModules()方法使用。 這兩者都只HttpApplication.InitInternal()方法中使用。 這是我的假設的基礎,但我想知道是否有人濫用IHttpModule.Init()用於應用程序啟動事件。

Init()只被調用一次(每個HttpApplication實例)

在我測試之后, IHttpModule初始化的內部工作原理如下:

  1. 通過instatiating和調用Init()方法,在Web應用程序啟動時初始化每個IHttpModule
  2. HttpApplication將所有模塊實例存儲在其Modules屬性中
  3. 然后在HttpApplication的整個生命周期中重用模塊,並且只要應用程序處於活動狀態,就不會丟棄/重新初始化模塊

所以最好的結果是

您不能將IHttpModule附加到應用程序級事件,但您可以將其Init()方法用作偽應用程序啟動事件委托 在其中,您可以執行通常放在Global.asax Application_Start委托內的任何代碼。

您還可以在我的博客文章中閱讀有關它的詳細信息。

但在現實生活中的Web服務器環境中要小心

但IIS使用稱為應用程序池的東西。 每個池可以有任意數量的HttpApplication實例。 是多個。 應用程序啟動創建所有這些實例 他們每個人都初始化自己的模塊列表,但只有第一個模塊執行Application_OnStart事件處理程序。

因此,每當您的模塊修改一些常見的共享資源時,您應該采取額外的措施來指示第一個模塊已經完成了該操作而其他模塊不再執行此操作。 閱讀有關它的其他博客文章 ,它將向您展示如何以及何時使用模塊進行線程鎖定,以使其實際上充當Application_OnStart事件處理程序。 BTW:如果需要,也可以處理Application_OnEnd事件。 ;)

詳細的博客文章鏈接

  1. 編寫處理Application_OnStart事件的自定義IHttpModule
  2. 如何正確使用IHttpModule來處理Application_OnStart事件

Application_Start僅在應用程序的生命周期內運行一次。

在請求處理開始之前,為HttpApplication的每個實例運行IHttpModule.Init 請參閱演練 Init是您可以注冊用於處理請求的事件的地方。

HttpApplication的一個實例可以重用於多個請求。 ASP.Net匯集了HttpApplication對象,因此對於HttpApplication的每個新實例都會調用一次Init

暫無
暫無

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

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