對來自瀏覽器的 ASP.NET 請求而提供服務僅是 Web 服務器架構的一小部分。
應用程式生命週期的一般情況
下表說明了 ASP.NET 應用程式生命週期中的各種情景。
使用者使用 網頁瀏覽器發送對應用資源的請求。
情景 |
描述 |
ASP.NET 應用程式的生命週期始於發送到 Web 服務器(ASP.NET 通常使用 IIS 做為伺服器)的請求。ASP.NET 是 Web 服務器的一個 ISAPI 擴充。當 Web 服務器接收請求後會分析被請求副檔名,檢測該使用哪種 ISAPI 擴充來處理,然後將請求傳遞給相應的 ISAPI 擴充。由 ASP.NET 處理的副檔名包括有 .aspx,.ascx,.ashx,和 .asmx。 注意:如果上述副檔名未被映射到 ASP.NET,那麼 ASP.NET 就無法接收請求。瞭解使用 ASP.NET 授權的應用程式是重要的。比如,.htm 檔案通常不會映射到 ASP.NET,ASP.NET 也不對 .html 檔案的請求進行驗證或處理。因此,即使對於只包含靜態內容的檔案,允許將副檔名改成映射成 ASP.NET 處理類型的 .aspx 來要求 ASP.NET 進行處理。 注意:如果為擁有特殊副檔名的檔案建立了自訂處理器,則需要將該副檔名映射到 IIS 中的 ASP.NET 擴充並在應用程式 Web.config 檔案中註冊自訂處理器。 |
ASP.NET 接收應用程式的第一個請求。 |
當 ASP.NET 接收到應用程式的第一個資源請求時,名為 ApplicationManager 的類對象會建立應用程式定義域空間(1)。應用程式定義域空間為應用程式提供獨立的全域變數,允許任何一個應用程式自由銷毀。應用程式定義域空間會建立 HostingEnvironment 執行個體,提供應用程式相關資訊(如儲存應用程式的目錄名)的訪問。 相關內容: ASP.NET 會編譯應用程式中被請求的最頂層項目,包括 App_Code 目錄中的應用程式代碼。 |
ASP.NET 為每個請求都建立核心處理對象。 |
在建立應用程式定義域空間並執行個體化 HostingEnvironment 對象之後,ASP.NET 會建立並初始化核心處理對象(如 HttpContext ,HttpRequest ,以及 HttpResponse )。HttpContext 類包含指派給當前應用請求的相關對象,如 HttpRequest 和 HttpResponse 。HttpRequest 對象包含當前請求的相關資訊,包括 Cookies 和瀏覽器資訊。HttpResponse 對象包含發送到用戶端的回應內容,包括所有被轉譯輸出內容和 Cookies。 |
為請求指派 HttpApplication 對象。 |
應用程式所有核心對象都初始化完成之後,應用程式就開始建立 HttpApplication 執行個體(2)。如果應用程式使用了 Global.asax 檔案,ASP.NET 還會為 Global.asax 建立 HttpApplication 的派生執行個體,並替代預設執行個體來重載應用程式。 注意:第一次請求或處理頁面時,會建立新的 HttpApplication 執行個體。但在需要效能最大化的時候,HttpApplication 執行個體可以在多個請求中重複使用。 在建立 HttpApplication 執行個體時會建立所有已配置模組。應用程式配置為執行個體後,ASP.NET 會建立 SessionStateModule 模型。在所有已配置模組建立完畢後會調用 HttpApplication 的 Init 方法。 相關內容: |
請求 HttpApplication 的管道處理。 |
下列事件在處理請求時由 HttpApplication 執行。開發人員在擴充 HttpApplication 時應該注意對這些事件的處理。
- 對請求的內容進行驗證,分析由瀏覽器發送的資訊並檢測是否含有潛在的不安全標記。
- 完成 URL 對應,映射 Web.config 檔案
UrlMappingsSection 元素中所有已配置 URL 對應。
- 引發
BeginRequest 事件。
- 引發
AuthenticateRequest 事件。
- 引發
PostAuthenticateRequest 事件。
- 引發
AuthorizeRequest 事件。
- 引發
PostAuthorizeRequest 事件。
- 引發
ResolveRequestCache 事件。
- 引發
PostResolveRequestCache 事件。
- 實現了
IHttpHandler 介面的自訂類處理具有特定副檔名的資源(必須經過應用程式的設定檔進行映射),ASP.NET 會在建立 Page 派生執行個體之前對其進行編譯。
引發
PostMapRequestHandler 事件。
處理特別情況,(設定檔中進行定義的具有特定副檔名的資源),我們使用實現了IHttpHandler介面的類;而對於普遍情況,我們使用實現了IHttpModule的類來處理(3)。
- 引發
AcquireRequestState 事件。
- 引發
PostAcquireRequestState 事件。
- 引發
PreRequestHandlerExecute 事件。
- 使用合適的
IHttpHandler 對象為請求調用 ProcessRequest 方法(或非同步版本的 BeginProcessRequest 方法)。比如,頁面請求則由當前頁面的執行個體進行處理。
- 引發
PostRequestHandlerExecute 事件。
- 引發
ReleaseRequestState 事件。
- 引發
PostReleaseRequestState 事件。
- 如果定義了
Filter 屬性則對回應內容進行過濾。
- 引發
UpdateRequestCache 事件。
- 引發
PostUpdateRequestCache 事件。
- 引發
EndRequest 事件。
|
接著,對於實現了IHttpHandler介面的類,比如預設的System.Web.UI.Page,就是我們的頁面了,其間的細節又會有一些關鍵事件。
表格 1. ASP.NET 1.1 頁面生存周期中的關鍵事件
階段
頁面事件 |
可重寫方法 |
頁面初始化 |
Init |
|
載入檢視狀態 |
|
LoadViewState |
處理回傳資料 |
|
實現 IPostBackDataHandler 介面的任何控制項中的 LoadPostData 方法 |
載入頁面 |
Load |
|
回傳更改通知 |
|
實現 IPostBackDataHandler 介面的任何控制項中的 RaisePostDataChangedEvent 方法 |
處理回傳事件 |
控制項所定義的任何回傳事件 |
實現了 IPostBackEventHandler 介面的任何控制項的 RaisePostBackEvent 方法 |
頁面呈現前階段 |
PreRender |
|
儲存檢視狀態 |
|
SaveViewState |
呈現頁面 |
|
Render |
卸載頁面 |
Unload |
|
這一階段的標誌就是 Init 事件,在成功建立頁面的控制項樹後,對應用程式激發這個事件。換而言之,當 Init 事件發生時,在 .aspx 源檔案中靜態聲明的所有控制項都已執行個體化並取其預設值。
ASP.NET 2.0 在 ASP.NET 頁面的生命週期方面有兩個主要的變化。首先,ASP.NET 2.0 提供了新的事件以支援新功能,這些功能包括主版頁面、個人化和整合的行動裝置支援。其次,ASP.NET 2.0 引入了跨頁發送 Web Form的技術。
新事件
與 ASP.NET 1.x 相比,ASP.NET 2.0 提供了更精確的頁面生命週期方法堆棧。這些新增的方法為 Web 開發人員提供了更進階別的控制。可以通過任何 ASP.NET 頁面上的“Page”對象訪問這些事件。
表 1 顯示了全面的方法列表。“方法”列顯示了實際的事件方法名稱,“活動”列指示事件是始終處於活動狀態還是僅在 PostBack 操作期間處於活動狀態。例如,可以使用新方法 TestDeviceFilter 來確定哪個裝置篩選條件可用,並使用此資訊決定如何顯示頁面。換句話說,新方法 LoadControlState 僅在回傳期間調用。可以替代此方法(與 SaveControlState 結合使用),以建立用於在回傳期間儲存和恢複控制項狀態的替換序列化方案。
表 2:ASP.NET 2.0 頁面生命週期方法
方法 |
活動 |
Constructor |
始終 |
Construct |
始終 |
TestDeviceFilter |
始終 |
AddParsedSubObject |
始終 |
DeterminePostBackMode |
始終 |
OnPreInit |
始終 |
LoadPersonalizationData |
始終 |
InitializeThemes |
始終 |
OnInit |
始終 |
ApplyControlSkin |
始終 |
ApplyPersonalization |
始終 |
OnInitComplete |
始終 |
LoadPageStateFromPersistenceMedium |
PostBack |
LoadControlState |
PostBack |
LoadViewState |
PostBack |
ProcessPostData1 |
PostBack |
OnPreLoad |
始終 |
OnLoad |
始終 |
ProcessPostData2 |
PostBack |
RaiseChangedEvents |
PostBack |
RaisePostBackEvent |
PostBack |
OnLoadComplete |
始終 |
OnPreRender |
始終 |
OnPreRenderComplete |
始終 |
SavePersonalizationData |
始終 |
SaveControlState |
始終 |
SaveViewState |
始終 |
SavePageStateToPersistenceMedium |
始終 |
Render |
始終 |
OnUnload |
始終 |
通過查看頁面生命週期的低層級詳細資料,我們可以發現在何處能夠自然地實現 ASP.NET 2.0 中的許多功能,例如主題和個人化。例如,可以在 IntializeThemes 事件中處理一個主題,在 LoadPersonalizationData 中載入個人化資料,並在以後應用於 ApplyPersonalization 方法。請注意,對於決定 Web 應用程式的最終外觀的 UI 元素而言,方法的順序極其重要。