1.global.asax文件概述
global.asax這個文件包含全局應用程序事件的事件處理程序。它響應應用程序級別和會話級別事件的代碼。
運行時, Global.asax 將被編譯成一個動態生成的 .NET Framework 類,該類是從HttpApplication基類派生的。
因此在global.asax中的代碼可以訪問HttpApplication類中所有的public或者protected的成員
global.asax不被用戶直接請求,但global.asax中的代碼會被自動執行來響應特定的應用程序事件。
global.asax是可選的,而且在一個web項目中是唯一的,它應該處於網站的根目錄。
2.一個請求的完整處理過程
以下過程由Internet Information Service(inetinfo.exe)(IIS)執行
1.客戶端發出請求
2.驗證請求
3.給請求授權
4.確定請求的緩存
5.獲取緩存狀態
6.在請求的處理程序執行前
7.http處理程序執行請求 (asp.net頁面由aspnet_wp.exe執行)
8.在請求的處理程序執行后
9.釋放請求狀態
10.更新請求緩存
11.請求結束
3.global.asax中的事件
global.asax中的所有事件可以分成兩種,一種是滿足特定事件時才會被觸發,一種是每次請求都會被按照順序執行的事件。
public class MvcApplication : System.Web.HttpApplication { protected void Application_Start(object sender, EventArgs e) { //不是每次請求都調用 //在Web應用程序的生命周期里就執行一次 //在應用程序第一次啟動和應用程序域創建事被調用 //適合處理應用程序范圍的初始化代碼 } void Application_End(object sender, EventArgs e) { //不是每次請求都調用 //在應用程序關閉時運行的代碼,在最后一個HttpApplication銷毀之后執行 //比如IIS重啟,文件更新,進程回收導致應用程序轉換到另一個應用程序域 } void Session_Start(object sender, EventArgs e) { //不是每次請求都調用 //會話開始時執行 } void Session_End(object sender, EventArgs e) { //不是每次請求都調用 //會話結束或過期時執行 //不管在代碼中顯式的清空Session或者Session超時自動過期,此方法都將被調用 } void Application_Init(object sender, EventArgs e) { //不是每次請求都調用 //在每一個HttpApplication實例初始化的時候執行 } void Application_Disposed(object sender, EventArgs e) { //不是每次請求都調用 //在應用程序被關閉一段時間之后,在.net垃圾回收器准備回收它占用的內存的時候被調用。 //在每一個HttpApplication實例被銷毀之前執行 } void Application_Error(object sender, EventArgs e) { //不是每次請求都調用 //所有沒有處理的錯誤都會導致這個方法的執行 } /*********************************************************************/ //每次請求都會按照順序執行以下事件 /*********************************************************************/ void Application_BeginRequest(object sender, EventArgs e) { //每次請求時第一個出發的事件,這個方法第一個執行 } void Application_AuthenticateRequest(object sender, EventArgs e) { //在執行驗證前發生,這是創建驗證邏輯的起點 } void Application_AuthorizeRequest(object sender, EventArgs e) { //當安全模塊已經驗證了當前用戶的授權時執行 } void Application_ResolveRequestCache(object sender, EventArgs e) { //當ASP.NET完成授權事件以使緩存模塊從緩存中為請求提供服務時發生,從而跳過處理程序(頁面或者是WebService)的執行。 //這樣做可以改善網站的性能,這個事件還可以用來判斷正文是不是從Cache中得到的。 } //------------------------------------------------------------------------ //在這個時候,請求將被轉交給合適程序。例如:web窗體將被編譯並完成實例化 //------------------------------------------------------------------------ void Application_AcquireRequestState(object sender, EventArgs e) { //讀取了Session所需的特定信息並且在把這些信息填充到Session之前執行 } void Application_PreRequestHandlerExecute(object sender, EventArgs e) { //在合適的處理程序執行請求前調用 //這個時候,Session就可以用了 } //------------------------------------------------- //在這個時候,頁面代碼將會被執行,頁面呈現為HTML //------------------------------------------------- void Application_PostRequestHandlerExecute(object sender, EventArgs e) { //當處理程序完成對請求的處理后被調用。 } void Application_ReleaseRequestState(object sender, EventArgs e) { //釋放請求狀態 } void Application_UpdateRequestCache(object sender, EventArgs e) { //為了后續的請求,更新響應緩存時被調用 } void Application_EndRequest(object sender, EventArgs e) { //EndRequest是在響應Request時最后一個觸發的事件 //但在對象被釋放或者從新建立以前,適合在這個時候清理代碼 } void Application_PreSendRequestHeaders(object sender, EventArgs e) { //向客戶端發送Http標頭之前被調用 } void Application_PreSendRequestContent(object sender, EventArgs e) { //向客戶端發送Http正文之前被調用 } }