global.asax檔案概述
global.asax這個檔案包含全域應用程式事件的事件處理常式。它響應應用程式層級和會話層級事件的代碼。
運行時, Global.asax 將被編譯成一個動態產生的 .NET Framework 類,該類是從HttpApplication基類派生的。
因此在global.asax中的代碼可以訪問HttpApplication類中所有的public或者protected的成員
global.asax不被使用者直接請求,但global.asax中的代碼會被自動執行來響應特定的應用程式事件。
global.asax是可選的,而且在一個web項目中是唯一的,它應該處於網站的根目錄。
一個請求的完整處理過程
以下過程由Internet Information Service(inetinfo.exe)(IIS)執行
1.用戶端發出請求
2.驗證請求
3.給請求授權
4.確定請求的緩衝
5.擷取緩衝狀態
6.在請求的處理常式執行前
7.http處理常式執行請求 (asp.net頁面由aspnet_wp.exe執行)
8.在請求的處理常式執行後
9.釋放請求狀態
10.更新要求緩衝
11.請求結束
global.asax中的事件
global.asax中的所有事件可以分成兩種,一種是滿足特定事件時才會被觸發,一種是每次請求都會被按照順序執行的事件。
下面是一個例子,包含了global.asax中包含的所有事件。
代碼<%@ Application Language="C#" %>
<script runat="server">
/*********************************************************************/
//以下事件不會在每一次請求的時候都會被調用,只會在特定的事情發生的時候被調用
/*********************************************************************/
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本文之前被調用
}
</script>
清清楚楚asp.net系列學習部落格目錄
參考資料:Pro ASP.NET 3.5 in C# 2008