Global.asax 檔案中可以執行的事件總結
Global.asax 檔案,有時候叫做 ASP.NET 應用程式檔案,提供了一種在一箇中心位置響應應用程式級或模組級事件的方法。你可以使用這個檔案實現應用程式安全性以及其它一些任務。下面讓我們詳細看一下如何在應用程式開發工作中使用這個檔案。
概述
Global.asax 位於應用程式根目錄下。雖然 Visual Studio .NET 會自動插入這個檔案到所有的 ASP.NET 專案中,但是它實際上是一個可選檔案。刪除它不會出問題——當然是在你沒有使用它的情況下。.asax 副檔名指出它是一個應用程式檔案,而不是一個使用 aspx 的 ASP.NET 檔案。
Global.asax 檔案被配置為任何(通過 URL 的)直接 HTTP 請求都被自動拒絕,所以使用者不能下載或檢視其內容。ASP.NET 頁面框架能夠自動識別出對Global.asax 檔案所做的任何更改。在 Global.asax 被更改後ASP.NET 頁面框架會重新啟動應用程式,包括關閉所有的瀏覽器會話,去除所有狀態資訊,並重新啟動應用程式域。
程式設計
Global.asax 檔案繼承自HttpApplication 類,它維護一個HttpApplication 物件池,並在需要時將物件池中的物件分配給應用程式。Global.asax 檔案包含以下事件:
· Application_Init:在應用程式被例項化或第一次被呼叫時,該事件被觸發。對於所有的HttpApplication 物件例項,它都會被呼叫。
· Application_Disposed:在應用程式被銷燬之前觸發。這是清除以前所用資源的理想位置。
· Application_Error:當應用程式中遇到一個未處理的異常時,該事件被觸發
· Application_Start:在HttpApplication 類的第一個例項被建立時,該事件被觸發。它允許你建立可以由所有HttpApplication 例項訪問的物件。
· Application_End:在HttpApplication 類的最後一個例項被銷燬時,該事件被觸發。在一個應用程式的生命週期內它只被觸發一次。
· Application_BeginRequest:在接收到一個應用程式請求時觸發。對於一個請求來說,它是第一個被觸發的事件,請求一般是使用者輸入的一個頁面請求(URL)。
· Application_EndRequest:針對應用程式請求的最後一個事件。
· Application_PreRequestHandlerExecute:在 ASP.NET 頁面框架開始執行諸如頁面或 Web 服務之類的事件處理程式之前,該事件被觸發。
· Application_PostRequestHandlerExecute:在 ASP.NET 頁面框架結束執行一個事件處理程式時,該事件被觸發。
· Applcation_PreSendRequestHeaders:在 ASP.NET 頁面框架傳送 HTTP 頭給請求客戶(瀏覽器)時,該事件被觸發。
· Application_PreSendContent:在 ASP.NET 頁面框架傳送內容給請求客戶(瀏覽器)時,該事件被觸發。
· Application_AcquireRequestState:在 ASP.NET 頁面框架得到與當前請求相關的當前狀態(Session 狀態)時,該事件被觸發。
· Application_ReleaseRequestState:在 ASP.NET 頁面框架執行完所有的事件處理程式時,該事件被觸發。這將導致所有的狀態模組儲存它們當前的狀態資料。
· Application_ResolveRequestCache:在 ASP.NET 頁面框架完成一個授權請求時,該事件被觸發。它允許快取模組從快取中為請求提供服務,從而繞過事件處理程式的執行。
· Application_UpdateRequestCache:在 ASP.NET 頁面框架完成事件處理程式的執行時,該事件被觸發,從而使快取模組儲存響應資料,以供響應後續的請求時使用。
· Application_AuthenticateRequest:在安全模組建立起當前使用者的有效的身份時,該事件被觸發。在這個時候,使用者的憑據將會被驗證。
· Application_AuthorizeRequest:當安全模組確認一個使用者可以訪問資源之後,該事件被觸發。
· Session_Start:在一個新使用者訪問應用程式 Web 站點時,該事件被觸發。
· Session_End:在一個使用者的會話超時、結束或他們離開應用程式 Web 站點時,該事件被觸發。
這個事件列表看起來好像多得嚇人,但是在不同環境下這些事件可能會非常有用。
使用這些事件的一個關鍵問題是知道它們被觸發的順序。Application_Init 和Application_Start 事件在應用程式第一次啟動時被觸發一次。相似地,Application_Disposed 和 Application_End 事件在應用程式終止時被觸發一次。此外,基於會話的事件(Session_Start 和 Session_End)只在使用者進入和離開站點時被使用。其餘的事件則處理應用程式請求,這些事件被觸發的順序是:
· Application_BeginRequest
· Application_AuthenticateRequest
· Application_AuthorizeRequest
· Application_ResolveRequestCache
· Application_AcquireRequestState
· Application_PreRequestHandlerExecute
· Application_PreSendRequestHeaders
· Application_PreSendRequestContent
· <<執行程式碼>>
· Application_PostRequestHandlerExecute
· Application_ReleaseRequestState
· Application_UpdateRequestCache
· Application_EndRequest
這些事件常被用於安全性方面。下面這個 C# 的例子演示了不同的Global.asax 事件,該例使用Application_Authenticate 事件來完成通過 cookie 的基於表單(form)的身份驗證。此外,Application_Start 事件填充一個應用程式變數,而Session_Start 填充一個會話變數。Application_Error 事件顯示一個簡單的訊息用以說明發生的錯誤。
protected void Application_Start(Object sender, EventArgs e) {
Application["Title"] = "Builder.com Sample";
}
protected void Session_Start(Object sender, EventArgs e) {
Session["startValue"] = 0;
}
protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
// Extract the forms authentication cookie
string cookieName = FormsAuthentication.FormsCookieName;
HttpCookie authCookie = Context.Request.Cookies[cookieName];
if(null == authCookie) {
// There is no authentication cookie.
return;
}
FormsAuthenticationTicket authTicket = null;
try {
authTicket = FormsAuthentication.Decrypt(authCookie.Value);
} catch(Exception ex) {
// Log exception details (omitted for simplicity)
return;
}
if (null == authTicket) {
// Cookie failed to decrypt.
return;
}
// When the ticket was created, the UserData property was assigned
// a pipe delimited string of role names.
string[2] roles
roles[0] = "One"
roles[1] = "Two"
// Create an Identity object
FormsIdentity id = new FormsIdentity( authTicket );
// This principal will flow throughout the request.
GenericPrincipal principal = new GenericPrincipal(id, roles);
// Attach the new principal object to the current HttpContext object
Context.User = principal;
}
protected void Application_Error(Object sender, EventArgs e) {
Response.Write("Error encountered.");
}
這個例子只是很簡單地使用了一些Global.asax 檔案中的事件;重要的是要意識到這些事件是與整個應用程式相關的。這樣,所有放在其中的方法都會通過應用程式的程式碼被提供,這就是它的名字為Global 的原因。
資源
Global.asax 檔案是 ASP.NET 應用程式的中心點。它提供無數的事件來處理不同的應用程式級任務,比如使用者身份驗證、應用程式啟動以及處理使用者會話等。你應該熟悉這個可選檔案,這樣就可以構建出健壯的ASP.NET 應用程式。
sln:解決方案檔案,為解決方案資源管理器提供顯示管理檔案的圖形介面所需的資訊。
.csproj:專案檔案,建立應用程式所需的引用、資料連線、資料夾和檔案的資訊。
.aspx:Web 窗體頁由兩部分組成:視覺元素(HTML、伺服器控制元件和靜態文字)和該頁的程式設計邏輯。Visual Studio 將這兩個組成部分分別儲存在一個單獨的檔案中。視覺元素在.aspx 檔案中建立。
.aspx.cs:Web 窗體頁的程式設計邏輯位於一個單獨的類檔案中,該檔案稱作程式碼隱藏類檔案(.aspx.cs)。
.cs: 類模組程式碼檔案。業務邏輯處理層的程式碼。
.asax:Global.asax 檔案(也叫做 ASP.NET 應用程式檔案)是一個可選的檔案,該檔案包含響應 ASP.NET 或 HTTP 模組引發的應用程式級別事件的程式碼。
.config:Web.config 檔案向它們所在的目錄和所有子目錄提供配置資訊。
.aspx.resx/.resx:資原始檔,資源是在邏輯上由應用程式部署的任何非可執行資料。通過在資原始檔中儲存資料,無需重新編譯整個應用程式即可更改資料。
.XSD:XML schema的一種.從DTD,XDR發展到XSD
.pdb:PDB(程式資料庫)檔案保持著除錯和專案狀態資訊,從而可以對程式的除錯配置進行增量連結。
.suo:解決方案使用者選項,記錄所有將與解決方案建立關聯的選項,以便在每次開啟時,它都包含您所做的自定義設定。
.asmx:asmx 檔案包含 WebService 處理指令,並用作 XML Web services 的可定址入口點
.vsdisco(專案發現)檔案 基於 XML 的檔案,它包含為 Web 服務提供發現資訊的資源的連結 (URL)。
.htc:一個HTML檔案,包含指令碼和定義元件的一系列HTC特定元素.htc提供在指令碼中implement元件的機制
.ascx 是使用者控制元件程式碼檔案
.aspx webform html指令碼檔案
.cs 是c#類檔案)
.vb 是vb類檔案)
.aspx.cs 和你的webform相關的後臺c#程式碼檔案,其實跟.cs是一樣的
.aspx.vb 和你的webform相關的後臺VB程式碼檔案,其實跟.vb是一樣的
web.config 配置檔案
.xml xml檔案
.css 樣式表文件
HttpApplication 類的例項(Global繼承自該類)是在 ASP.NET 基礎結構中建立的,而不是由使用者直接建立的。HttpApplication 類的一個例項在其生存期內被用於處理多個請求,但它一次只能處理一個請求。這樣,成員變數才可用於儲存針對每個請求的資料。
應用程式按照以下順序執行由 global.asax 檔案中定義的模組或使用者程式碼處理的事件:
1、BeginRequest
(在 ASP.NET 響應請求時作為 HTTP 執行管線鏈中的第一個事件發生)
2、AuthenticateRequest
(當安全模組已建立使用者標識時發生。注:AuthenticateRequest 事件發出訊號表示配置的身份驗證機制已對當前請求進行了身份驗證。 預訂 AuthenticateRequest 事件可確保在處理附加的模組或事件處理程式之前對請求進行身份驗證。)
3、PostAuthenticateRequest
(注意:該事件在 .NET Framework 2.0 版中是新增的。 當安全模組已建立使用者標識時發生。 PostAuthenticateRequest 事件在 AuthenticateRequest 事件發生之後引發。預訂 PostAuthenticateRequest 事件的功能可以訪問由 PostAuthenticateRequest 處理的任何資料。)
4、AuthorizeRequest
(當安全模組已驗證使用者授權時發生。AuthorizeRequest 事件發出訊號表示 ASP.NET 已對當前請求進行了授權。 預訂 AuthorizeRequest 事件可確保在處理附加的模組或事件處理程式之前對請求進行身份驗證和授權。)
5、PostAuthorizeRequest
(.NET 2.0裡新增的事件。在當前請求的使用者已獲授權時發生。PostAuthorizeRequest 事件發出訊號表示 ASP.NET 已對當前請求進行了授權。預訂PostAuthorizeRequest 事件可確保在處理附加的模組或處理程式之前對請求進行身份驗證和授權。)
6、ResolveRequestCache
(當 ASP.NET 完成授權事件以使快取模組從快取中為請求提供服務時發生,從而跳過事件處理程式(例如某個頁或 XML Web ervices)的執行。)
7、PostResolveRequestCache
(在 ASP.NET 跳過當前事件處理程式的執行並允許快取模組滿足來自快取的請求時發生。)在 PostResolveRequestCache 事件之後、PostMapRequestHandler
事件之前建立一個事件處理程式(對應於請求 URL 的頁)。
8、PostMapRequestHandler
在 ASP.NET 已將當前請求對映到相應的事件處理程式時發生
9、AcquireRequestState
當 ASP.NET 獲取與當前請求關聯的當前狀態(如會話狀態)時發生
10、PostAcquireRequestState
在已獲得與當前請求關聯的請求狀態(例如會話狀態)時發生
11、PreRequestHandlerExecute
恰好在 ASP.NET 開始執行事件處理程式(例如,某頁或某個 XML Web services)前發生
12、PostRequestHandlerExecute
在 ASP.NET 事件處理程式(例如,某頁或某個 XML Web service)執行完畢時發生
13、ReleaseRequestState
在 ASP.NET 執行完所有請求事件處理程式後發生。該事件將使狀態模組儲存當前狀態資料。
14、PostReleaseRequestState
在 ASP.NET 已完成所有請求事件處理程式的執行並且請求狀態資料已儲存時發生。
15、UpdateRequestCache
當 ASP.NET 執行完事件處理程式以使快取模組儲存將用於從快取為後續請求提供服務的響應時發生。
16、PostUpdateRequestCache
在 ASP.NET 完成快取模組的更新並存儲了用於從快取中為後續請求提供服務的響應後,發生此事件。
17、EndRequest
在 ASP.NET 響應請求時作為 HTTP 執行管線鏈中的最後一個事件發生。