如何在ASP.NET應用程序中初始化(6)_ASP教程
推薦:程序員看淘寶,如何用Session保存用戶狀態網上購物已經成為現在生活不可缺少的一部分。我們上淘寶只是為了消費,今天換一個角度,用程序員的眼光看看淘寶。 如上圖: 情況一:當打開一些和賬戶有關的網頁,檢測用戶沒有登錄,系統自動會跳轉到登錄界面。 情況二:當檢測到已經有用戶登錄,頁面會自動跳轉到目的
前面介紹了4種在ASP.NET執行初始化的方法,你或許想知道它們到底有哪些區別呢?
由于它們都能實現初始化的操作,它們的差別也只有執行的時刻不同而已,我們可以用簡單的方法區分它們的調用位置:看異常的調用堆棧信息。
AppInitialize方法異常時的調用堆棧信息:

HttpModule異常時的調用堆棧信息:

PreApplicationStartMethodAttribute異常時的調用堆棧信息:

Global.asax的Application_Start事件處理器的調用方式則不同,ASP.NET采用了反射調用,當異常發生只保留了內部異常,我們看不到調用堆棧(不信的話,自己去試試)。
沒關系,既然ASP.NET不告訴我們調用堆棧信息,我們自己也可以去取,請看下面的代碼:
- void Application_Start()
- {
- System.Diagnostics.StackTrace stack = new System.Diagnostics.StackTrace();
- System.IO.File.WriteAllText("h:\\Application_Start_stack.txt", stack.ToString());
- }
再打開文件看一下吧。

說明:Global.asax的Application_Start事件處理器還有幾種等效的方法:
- // 這二個方法都可以實現與Application_Start(object sender, EventArgs e)相同的行為。
- void Application_OnStart()
- {
- }
- void Application_Start()
- {
- }
根據以上分析,可以可以得知:
1. AppInitialize和PreApplicationStartMethodAttribute指向的方法被調用的時機發生在ASP.NET創建宿主環境時,屬于比較早的時刻。
2. Application_Start和HttpModule的調用時刻要晚一點。
這個結論有用嗎?
其實我也感覺意義不大,不過分析它僅僅為了滿足我的求知欲和好奇心而已,你是否也有這樣的好奇心呢?
如果你仍然好奇想知道這4種方法的執行時機的先后順序,我也能告訴你:
1. PreApplicationStartMethodAttribute指向的方法。
2. App_Code中的appInitialize方法。
3. Application_Start。
4. HttpModule
再補充一點:在開發環境中,當我們編譯網站時,PreApplicationStartMethodAttribute指向的方法可能會被調用,這處決于類庫的程序集是否發生了修改。
到底該選擇哪種初始化方法?
今天給大家介紹了4種在ASP.NET中執行初始化的方法,或許有些人會想:到底該選擇哪種初始化方法呢?
的確,方法越多越讓人迷惑。
下面的觀點僅代表我個人的建議,你也可以根據自己的喜好來選擇。
1. 優先選擇Application_Start(雖然IIS的經典模式下需要多寫點代碼),因為任何人找初始化代碼時都會想到那里,便于其他人維護。
2. AppInitialize方法雖然使用簡單,但它并不適合于WebApplication項目。
3. PreApplicationStartMethodAttribute只支持ASP.NET 4.0以上版本,且尤其適合于類庫的內部初始化。
4. 當以上方法都不可行時,HttpModule將成為最后的救命稻草,它適合所有ASP.NET版本。
分享:ASP.NET七大身份驗證方式及解決方案在B/S系統開發中,經常需要使用身份驗證。因為web應用程序非常特殊,和傳統的C/S程序不同,默認情況下(不采用任何身份驗證方式和權限控制手段),當你的程序在互聯網/局域網上公開后,任何人都能夠訪問你的web應用程序的資源,這樣很難保障應用程序安全性。通俗點來說:
- 相關鏈接:
- 教程說明:
ASP教程-如何在ASP.NET應用程序中初始化(6)
。