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中的所有事件可以分成兩種,一種是滿足特定事件時才會被觸發,一種是每次請求都會被按照順序執行的事件。
1 public class MvcApplication : System.Web.HttpApplication 2 { 3 protected void Application_Start(object sender, EventArgs e) 4 { 5 //不是每次請求都調用 6 //在Web應用程序的生命周期里就執行一次 7 //在應用程序第一次啟動和應用程序域創建事被調用 8 //適合處理應用程序范圍的初始化代碼 9 } 10 11 void Application_End(object sender, EventArgs e) 12 { 13 //不是每次請求都調用 14 //在應用程序關閉時運行的代碼,在最后一個HttpApplication銷毀之后執行 15 //比如IIS重啟,文件更新,進程回收導致應用程序轉換到另一個應用程序域 16 } 17 18 void Session_Start(object sender, EventArgs e) 19 { 20 //不是每次請求都調用 21 //會話開始時執行 22 } 23 24 void Session_End(object sender, EventArgs e) 25 { 26 //不是每次請求都調用 27 //會話結束或過期時執行 28 //不管在代碼中顯式的清空Session或者Session超時自動過期,此方法都將被調用 29 } 30 31 void Application_Init(object sender, EventArgs e) 32 { 33 //不是每次請求都調用 34 //在每一個HttpApplication實例初始化的時候執行 35 } 36 37 void Application_Disposed(object sender, EventArgs e) 38 { 39 //不是每次請求都調用 40 //在應用程序被關閉一段時間之后,在.net垃圾回收器准備回收它占用的內存的時候被調用。 41 //在每一個HttpApplication實例被銷毀之前執行 42 } 43 44 void Application_Error(object sender, EventArgs e) 45 { 46 //不是每次請求都調用 47 //所有沒有處理的錯誤都會導致這個方法的執行 48 } 49 50 51 /*********************************************************************/ 52 //每次請求都會按照順序執行以下事件 53 /*********************************************************************/ 54 55 void Application_BeginRequest(object sender, EventArgs e) 56 { 57 //每次請求時第一個出發的事件,這個方法第一個執行 58 } 59 60 void Application_AuthenticateRequest(object sender, EventArgs e) 61 { 62 //在執行驗證前發生,這是創建驗證邏輯的起點 63 } 64 65 void Application_AuthorizeRequest(object sender, EventArgs e) 66 { 67 //當安全模塊已經驗證了當前用戶的授權時執行 68 } 69 70 void Application_ResolveRequestCache(object sender, EventArgs e) 71 { 72 //當ASP.NET完成授權事件以使緩存模塊從緩存中為請求提供服務時發生,從而跳過處理程序(頁面或者是WebService)的執行。 73 //這樣做可以改善網站的性能,這個事件還可以用來判斷正文是不是從Cache中得到的。 74 } 75 76 //------------------------------------------------------------------------ 77 //在這個時候,請求將被轉交給合適程序。例如:web窗體將被編譯並完成實例化 78 //------------------------------------------------------------------------ 79 80 void Application_AcquireRequestState(object sender, EventArgs e) 81 { 82 //讀取了Session所需的特定信息並且在把這些信息填充到Session之前執行 83 } 84 85 void Application_PreRequestHandlerExecute(object sender, EventArgs e) 86 { 87 //在合適的處理程序執行請求前調用 88 //這個時候,Session就可以用了 89 } 90 91 //------------------------------------------------- 92 //在這個時候,頁面代碼將會被執行,頁面呈現為HTML 93 //------------------------------------------------- 94 95 void Application_PostRequestHandlerExecute(object sender, EventArgs e) 96 { 97 //當處理程序完成對請求的處理后被調用。 98 } 99 100 void Application_ReleaseRequestState(object sender, EventArgs e) 101 { 102 //釋放請求狀態 103 } 104 105 void Application_UpdateRequestCache(object sender, EventArgs e) 106 { 107 //為了后續的請求,更新響應緩存時被調用 108 } 109 110 void Application_EndRequest(object sender, EventArgs e) 111 { 112 //EndRequest是在響應Request時最后一個觸發的事件 113 //但在對象被釋放或者從新建立以前,適合在這個時候清理代碼 114 } 115 116 void Application_PreSendRequestHeaders(object sender, EventArgs e) 117 { 118 //向客戶端發送Http標頭之前被調用 119 } 120 121 void Application_PreSendRequestContent(object sender, EventArgs e) 122 { 123 //向客戶端發送Http正文之前被調用 124 } 125 }