發現不少朋友跟我一樣,錯把IHttpModule.Init拿來當做Application_Start的替代品,在其中做一些應用程序初始化的操作。
但其實IHttpModule.Init和Global.asax中的Application_Start事件性質是不同的,不能直接拿IHttpModule.Init來代替Application_Start做ASP.NET應用程序的初始化過程。也不能簡單的拿Init方法被重復調用來斷定是ASP.Net程序發生了重啟。
原因是IHttpModule.Init在ASP.Net響應請求時有可能被重復調用多次,在實際網站運行過程中更是極有可能發生的。
為什麼IHttpModule.Init會被調用多次呢 原因是每個HttpApplication實例同時只能處理一個請求,而ASP.Net是支持一定的並發請求的,所以HttpApplication的實例在不夠響應並發請求時會被創建多個來響應不同的請求,而每個HttpApplication實例在被創建後都會創建一組新的HttpModule並調用Init方法。
而Application_Start只會在第一個HttpApplication對象被創建後調用,後續創建的HttpApplication實例不會觸發此事件。
我想HttpApplication實例的重用是導致IHttpModule的Init方法用途被誤解的一個主要原因,因為平時我們調試程序時都是只有一個請求,基本上不可能發生重復執行HttpModule的Init方法的情況。而在實際網站運行環境下,並發請求是很平常的,如果誤用了Init方法,可能會導致程序在實際環境下出奇怪問題。
具體細節可以參考MSDN的《IIS 5.0 和 6.0 的 ASP.Net 應用程序生命周期概述》一文,以下是文章中提供的圖片: