程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> IHttpModule.Init方法被執行多次的原因

IHttpModule.Init方法被執行多次的原因

編輯:關於C#

發現不少朋友跟我一樣,錯把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 應用程序生命周期概述》一文,以下是文章中提供的圖片:

也可以使用Refelector反編譯System.Web程序集,分析IHttpModule.Init方法的調用關系,

你最後將找到System.Web.HttpApplicationFactory.GetNormalApplicationInstance方法,其中可以看出來HttpApplication的實例是怎樣重用和創建的。

綜上所述,IHttpModule.Init是不能簡單的作為Application_Start的替代品的。

一個比較簡單的辦法是用一個靜態的bool類型字段作為初始化標記,HttpModule的Init執行過程序所需的初始化後,就將標記設置為true,下次就不再重復初始化。

但是,類似注冊BeginRequest事件這樣的代碼,還是需要每次Init都執行,因為這時候的HttpModule實例是不一樣的,如果通過判斷靜態的初始化標記字段而不重復注冊事件的話,會導致類似URL重寫有時候有執行有時候沒執行的奇怪問題。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved