[英]Advanced: How many times does HttpModule Init() method get called during application's life?
Web應用程序初始化如下:
HttpApplication
實例(在global.asax
隱藏中定義)。 Modules
集合中(類型為HttpModuleCollection
) 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
初始化的內部工作原理如下:
Init()
方法,在Web應用程序啟動時初始化每個IHttpModule
HttpApplication
將所有模塊實例存儲在其Modules
屬性中 HttpApplication
的整個生命周期中重用模塊,並且只要應用程序處於活動狀態,就不會丟棄/重新初始化模塊 您不能將IHttpModule
附加到應用程序級事件,但您可以將其Init()
方法用作偽應用程序啟動事件委托 。 在其中,您可以執行通常放在Global.asax
Application_Start
委托內的任何代碼。
您還可以在我的博客文章中閱讀有關它的詳細信息。
但IIS使用稱為應用程序池的東西。 每個池可以有任意數量的HttpApplication
實例。 是多個。 應用程序啟動創建所有這些實例 他們每個人都初始化自己的模塊列表,但只有第一個模塊執行Application_OnStart
事件處理程序。
因此,每當您的模塊修改一些常見的共享資源時,您應該采取額外的措施來指示第一個模塊已經完成了該操作而其他模塊不再執行此操作。 閱讀有關它的其他博客文章 ,它將向您展示如何以及何時使用模塊進行線程鎖定,以使其實際上充當Application_OnStart
事件處理程序。 BTW:如果需要,也可以處理Application_OnEnd
事件。 ;)
Application_Start僅在應用程序的生命周期內運行一次。
在請求處理開始之前,為HttpApplication的每個實例運行IHttpModule.Init 。 請參閱演練 。 Init是您可以注冊用於處理請求的事件的地方。
HttpApplication的一個實例可以重用於多個請求。 ASP.Net匯集了HttpApplication對象,因此對於HttpApplication的每個新實例都會調用一次Init
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.