2009-06-06 105 views
21

有人可以解釋爲什麼在應用程序啓動時多次調用從HttpApplication派生的自定義類的構造函數?爲什麼多次調用HttpApplication構造函數

我的代碼結構如下:
- 我全球類Global.asax中派生從CustomApp類。
- 該CustomApp類從的HttpApplication

全球類是在啓動時創建的派生,但是當我把一個斷點在構造函數,調用它幾次!我以爲應該只有一個應用程序類創建的實例嗎?

我錯了嗎?

UPD:Web服務器確實可以創建幾個的HttpApplication實例來處理在同一時間進來的多個請求。當您在後代的構造函數中放置斷點時,這會變得尤爲明顯。一些請求將從客戶端(http內容,CSS文件等)中掛起,併爲它們提供服務,Web服務器將創建HttpApp的新實例。所以,在編寫應用程序初始化邏輯時要小心這一點。

+0

是否可以發佈顯示此行爲的精簡代碼片段? – 2009-06-06 06:21:19

回答

15

我相信ASP.NET運行時可能會爲每個應用程序域創建多個HttpApplication。所以HttpApplication.Init和Ctor可能會不止一次地被調用。

如果您想要只有一次運行的初始化代碼,則應該使用Application_Start事件,該事件僅在每個應用程序中調用一次。

+0

是否有一個事件(或類似),我可以掛鉤爲Applcation_Start,因爲我需要我的網站以外的HttpApplication類? – 2010-01-27 16:37:53

+1

只需在Global.asax.cs中實現一個`Applcation_Start`方法,它將在開始時自動連線並調用。 http://msdn.microsoft.com/en-us/library/ms178473.aspx – mckamey 2010-01-28 08:02:20

6

請看帖子global.asax in ASP.NET - 它解釋了爲什麼有多個HttpApplication實例。基本上有兩個池:特殊和正常。普通池包含請求使用的HttpApplication實例(每個請求都有自己的HttpApplication實例)。特殊池包含用於應用程序級別事件的HttpApplication對象(如Application_Start,Application_Error)。

相關問題