IIS 5.0 和 6.0 的 ASP.NET 應用程序生命週期概述

http://msdn.microsoft.com/zh-cn/library/ms178473(v=VS.100).aspxweb

在 ASP.NET 中,若要對 ASP.NET 應用程序進行初始化並使它處理請求,必須執行一些處理步驟。 此外,ASP.NET 只是對瀏覽器發出的請求進行處理的 Web 服務器結構的一部分。 瞭解應用程序生命週期很是重要,這樣才能在適當的生命週期階段編寫代碼,達到預期的效果。瀏覽器

 下表描述了 ASP.NET 應用程序生命週期的各個階段。緩存

用戶從 Web 服務器請求應用程序資源。服務器

ASP.NET 應用程序的生命週期以瀏覽器向 Web 服務器(對於 ASP.NET 應用程序,一般爲 IIS)發送請求爲起點。 ASP.NET 是 Web 服務器下的 ISAPI 擴展。 Web 服務器接收到請求時,會對所請求的文件的文件擴展名進行檢查,肯定應由哪一個 ISAPI 擴展處理該請求,而後將該請求傳遞給合適的 ISAPI 擴展。 ASP.NET 處理已映射到其上的文件擴展名,如 .aspx、.ascx、.ashx 和 .asmx。session

ASP.NET 接收對應用程序的第一個請求。app

當 ASP.NET 接收到對應用程序中任何資源的第一個請求時,名爲 ApplicationManager的類會建立一個應用程序域。 應用程序域爲全局變量提供應用程序隔離,並容許單獨卸載每一個應用程序。 在應用程序域中,將爲名爲 HostingEnvironment的類建立一個實例,該實例提供對有關應用程序的信息(如存儲該應用程序的文件夾的名稱)的訪問。異步

 

p_w_picpath

若是須要,ASP.NET 還可對應用程序中的頂級項進行編譯,其中包括 App_Code 文件夾中的應用程序代碼。 有關更多信息,請參見本主題後面的「編譯生命週期」。ide

爲每一個請求建立 ASP.NET 核心對象。post

建立了應用程序域並對 HostingEnvironment 對象進行了實例化以後,ASP.NET 將建立並初始化核心對象,如 HttpContextHttpRequestHttpResponseHttpContext 類包含特定於當前應用程序請求的對象,如 HttpRequestHttpResponse 對象。 HttpRequest 對象包含有關當前請求的信息,包括 Cookie 和瀏覽器信息。 HttpResponse 對象包含發送到客戶端的響應,包括全部呈現的輸出和 Cookie。性能

HttpApplication 對象分配給請求

初始化全部核心應用程序對象以後,將經過建立 HttpApplication 類的實例啓動應用程序。 若是應用程序具備 Global.asax 文件,則 ASP.NET 會建立 Global.asax 類(從 HttpApplication 類派生)的一個實例,並使用該派生類表示應用程序

注意注意

第一次在應用程序中請求 ASP.NET 頁或進程時,將建立 HttpApplication 的一個新實例。不過,爲了儘量提升性能,可對多個請求重複使用 HttpApplication 實例。

建立 HttpApplication 的實例時,將同時建立全部已配置的模塊。 例如,若是將應用程序這樣配置,ASP.NET 就會建立一個 SessionStateModule 模塊。 建立了全部已配置的模塊以後,將調用HttpApplication 類的 Init 方法。

下面的關係圖說明了這種關係:

圖:應用程序環境

HttpApplication 管線處理請求。

在處理該請求時將由 HttpApplication 類執行如下事件。 但願擴展 HttpApplication 類的開發人員尤爲須要注意這些事件。

  1. 對請求進行驗證,將檢查瀏覽器發送的信息,並肯定其是否包含潛在惡意標記。 有關更多信息,請參見 ValidateRequest腳本侵入概述

  2. 若是已在 Web.config 文件的 UrlMappingsSection 節中配置了任何 URL,則執行 URL 映射。

  3. 引起 BeginRequest事件。

  4. 引起 AuthenticateRequest 事件。

  5. 引起 PostAuthenticateRequest 事件。

  6. 引起 AuthorizeRequest事件。

  7. 引起 PostAuthorizeRequest 事件。

  8. 引起 ResolveRequestCache事件。

  9. 引起 PostResolveRequestCache 事件。

  10. 根據所請求資源的文件擴展名(在應用程序的配置文件中映射),選擇實現 IHttpHandler 的類,對請求進行處理。 若是該請求針對從 Page 類派生的對象(頁),而且須要對該頁進行編譯,則 ASP.NET 會在建立該頁的實例以前對其進行編譯。

  11. 引起 PostMapRequestHandler 事件。

  12. 引起 AcquireRequestState 事件。

  13. 引起 PostAcquireRequestState 事件。

  14. 引起 PreRequestHandlerExecute 事件。

  15. 爲該請求調用合適的 IHttpHandler 類的 Proce***equest 方法(或異步版 IHttpAsyncHandler.BeginProce***equest)。 例如,若是該請求針對某頁,則當前的頁實例將處理該請求。

  16. 引起 PostRequestHandlerExecute 事件。

  17. 引起 ReleaseRequestState 事件。

  18. 引起 PostReleaseRequestState 事件。

  19. 若是定義了 Filter 屬性,則執行響應篩選。

  20. 引起 UpdateRequestCache 事件。

  21. 引起 PostUpdateRequestCache 事件。

  22. 引起 EndRequest事件。

  23. 引起 PreSendRequestHeaders 事件。

  24. 引起 PreSendRequestContent 事件。

 

 


生命週期事件和 Global.asax 文件

在應用程序的生命週期期間,應用程序會引起可處理的事件並調用可重寫的特定方法。 若要處理應用程序事件或方法,能夠在應用程序根目錄中建立一個名爲 Global.asax 的文件。

若是建立了 Global.asax 文件,ASP.NET 會將其編譯爲從 HttpApplication 類派生的類,而後使用該派生類表示應用程序。

HttpApplication 進程的一個實例每次只處理一個請求。因爲在訪問應用程序類中的非靜態成員時不須要將其鎖定,這樣能夠簡化應用程序的事件處理過程。 這樣還能夠將特定於請求的數據存儲在應用程序類的非靜態成員中。 例如,能夠在 Global.asax 文件中定義一個屬性,而後爲該屬性賦一個特定於請求的值。

經過使用命名約定 Application_event(如 Application_BeginRequest),ASP.NET 可在 Global.asax 文件中將應用程序事件自動綁定處處理程序。 這與將 ASP.NET 頁方法自動綁定到事件(如頁的 Page_Load 事件)的方法相似。

Application_Start 和 Application_End 方法是不表示 HttpApplication 事件的特殊方法。 在應用程序域的生命週期期間,ASP.NET 僅調用這些方法一次,而不是對每一個 HttpApplication 實例都調用一次。

下表列出在應用程序生命週期期間使用的一些事件和方法。 實際遠不止列出的這些事件,但這些事件是最經常使用的。

Application_Start

請求 ASP.NET 應用程序中第一個資源(如頁)時調用。 在應用程序的生命週期期間僅調用一次 Application_Start 方法。 能夠使用此方法執行啓動任務,如將數據加載到緩存中以及初始化靜態值。

在應用程序啓動期間應僅設置靜態數據。 因爲實例數據僅可由建立的 HttpApplication 類的第一個實例使用,因此請勿設置任何實例數據。

Application_event

在應用程序生命週期中的適當時候引起,請參見本主題前面的應用程序生命週期表中列出的內容。

Application_Error 可在應用程序生命週期的任何階段引起。

因爲請求會短路,所以 Application_EndRequest 是惟一能保證每次請求時都會引起的事件。 例如,若是有兩個模塊處理 Application_BeginRequest 事件,第一個模塊引起一個異常,則不會爲第二個模塊調用 Application_BeginRequest 事件。 可是,會始終調用 Application_EndRequest 方法使應用程序清理資源。

Init

在建立了全部模塊以後,HttpApplication 類的每一個實例都調用一次。

Dispose

在銷燬應用程序實例以前調用。 可以使用此方法手動釋聽任何非託管資源。 有關更多信息,請參見清理非託管資源

Application_End

在卸載應用程序以前對每一個應用程序生命週期調用一次。 


HTTP Module

 

ASP.NET 應用程序生命週期可經過 IHttpModule 類進行擴展。 ASP.NET 包含若干實現 IHttpModule 的類,如 SessionStateModule 類。 您還能夠自行建立實現 IHttpModule 的類。

若是嚮應用程序添加模塊,模塊自己會引起事件。 經過使用 modulename_eventname 約定,應用程序能夠在 Global.asax 文件中預訂這些事件。 例如,若要處理 FormsAuthenticationModule 對象引起的 Authenticate 事件,能夠建立一個名爲 FormsAuthentication_Authenticate 的處理程序。

相關文章
相關標籤/搜索