上一篇說到applicationInstance會執行一些列的事件。下面是我在msdn上找到有關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 接收到對應用程序中任何資源的第一個請求時,名為ApplicationManager的類會創建一個應用程序域。應用程序域為全局變量提供應用程序隔離,并允許單獨卸載每個應用程序。在應用程序域中,將為名為HostingEnvironment的類創建一個實例,該實例提供對有關應用程序的信息(如存儲該應用程序的文件夾的名稱)的訪問。
為每個請求創建 ASP.NET 核心對象
創建了應用程序域并對HostingEnvironment對象進行了實例化之后,ASP.NET 將創建并初始化核心對象,如HttpContext、HttPRequest和HttpResponse。HttpContext類包含特定于當前應用程序請求的對象,如HttpRequest和HttpResponse對象。HttpRequest對象包含有關當前請求的信息,包括 Cookie 和瀏覽器信息。HttpResponse對象包含發送到客戶端的響應,包括所有呈現的輸出和 Cookie。
將HttpApplication對象分配給請求
初始化所有核心應用程序對象之后,將通過創建HttpApplication類的實例啟動應用程序。如果應用程序具有 Global.asax 文件,則 ASP.NET 會創建 Global.asax 類(從HttpApplication類派生)的一個實例,并使用該派生類表示應用程序。
創建HttpApplication的實例時,將同時創建所有已配置的模塊。例如,如果將應用程序這樣配置,ASP.NET 就會創建一個sessionStateModule模塊。創建了所有已配置的模塊之后,將調用HttpApplication類的Init方法。
由HttpApplication管線處理請求。
在處理該請求時將由HttpApplication類執行以下事件。希望擴展HttpApplication類的開發人員尤其需要注意這些事件。
對請求進行驗證,將檢查瀏覽器發送的信息,并確定其是否包含潛在惡意標記。有關更多信息,請參見ValidateRequest和腳本侵入概述。
如果已在 Web.config 文件的UrlMappingsSection節中配置了任何 URL,則執行 URL 映射。
引發BeginRequest事件;第一個事件
引發AuthenticateRequest事件;驗證請求,開始檢查用戶的身份,一把是獲取請求的用戶信息
引發PostAuthenticateRequest事件;用戶身份已經檢查完畢,檢查完成后可以通過HttpContext的User屬性獲取到,微軟內置的身份驗證機制,平時很少用到
引發AuthorizeRequest事件;開始進行用戶權限檢查,如果用戶沒有通過上面的安全檢查,一般會直接調至EndRequest事件,也就是直接跳至最后一個事件
引發PostAuthorizeRequest事件;用戶請求已經獲取授權
引發ResolveRequestCache事件;緩存,如果存在以前處理的緩存結果,則不再進行請求處理工作,返回緩存結果
引發PostResolveRequestCache事件;緩存檢查結束
根據所請求資源的文件擴展名(在應用程序的配置文件中映射),選擇實現IHttpHandler的類,對請求進行處理。如果該請求針對從Page類派生的對象(頁),并且需要對該頁進行編譯,則 ASP.NET 會在創建該頁的實例之前對其進行編譯;創建所請求的前臺頁面類
引發PostMapRequestHandler事件;已經創建處理請求的處理器對象(IHttpHandler)
引發AcquireRequestState事件;獲取請求狀態,一般用于獲取session
引發PostAcquireRequestState事件。已經獲取到了session,如果獲取到,則將session的值封裝到httpcontext中的session屬性中去,
引發PreRequestHandlerExecute事件。以為上個事件已經封裝了session信息,所以接下來就是驗證身份信息的最好位置,如果不通過,直接處理,提高效率。這里也是準備執行處理程序,及調用HttpContext中Handler屬性的ProcessRequest
為該請求調用合適的IHttpHandler類的ProcessRequest方法(或異步版IHttpAsyncHandler.BeginProcessRequest)。例如,如果該請求針對某頁,則當前的頁實例將處理該請求。
引發PostRequestHandlerExecute事件;頁面的ProcessRequest方法執行完成
引發ReleaseRequestState事件;準備釋放請求狀態session
引發PostReleaseRequestState事件;已經釋放請求狀態
如果定義了Filter屬性,則執行響應篩選。
引發UpdateRequestCache事件;更新緩存
引發PostUpdateRequestCache事件;更新緩存完畢
引發EndRequest事件;結束請求
引發PreSendRequestHeaders事件;可通過發送的頭信息設置參數,例如將類型設置為text/plain等
引發PreSendRequestContent事件;處理數據,如配置壓縮,則可在這里對數據進行壓縮發送
好了,不貼人家的東西了,感興趣的可以到原網站去看一下。我們重點就是看一下HttpApplication管線處理請求。下面是對事件的解釋
事件名稱 | 說明 | |
---|---|---|
![]() | AcquireRequestState | 當 ASP.NET 獲取與當前請求關聯的當前狀態(如會話狀態)時發生。 |
![]() | AuthenticateRequest | 當安全模塊已建立用戶標識時發生。 |
![]() | AuthorizeRequest | 當安全模塊已驗證用戶授權時發生。 |
![]() | BeginRequest | 在 ASP.NET 響應請求時作為 HTTP 執行管線鏈中的第一個事件發生。 |
![]() | Disposed | 在釋放應用程序時發生。 |
![]() | EndRequest | 在 ASP.NET 響應請求時作為 HTTP 執行管線鏈中的最后一個事件發生。 |
![]() | Error | 當引發未經處理的異常時發生。 |
![]() | LogRequest | 恰好在 ASP.NET 為當前請求執行任何記錄之前發生。 |
![]() | MapRequestHandler | 基礎結構。在選擇了用來響應請求的處理程序時發生。 |
![]() | PostAcquireRequestState | 在已獲得與當前請求關聯的請求狀態(例如會話狀態)時發生。 |
![]() | PostAuthenticateRequest | 當安全模塊已建立用戶標識時發生。 |
![]() | PostAuthorizeRequest | 在當前請求的用戶已獲授權時發生。 |
![]() | PostLogRequest | 在 ASP.NET 處理完LogRequest事件的所有事件處理程序后發生。 |
![]() | PostMapRequestHandler | 在 ASP.NET 已將當前請求映射到相應的事件處理程序時發生。 |
![]() | PostReleaseRequestState | 在 ASP.NET 已完成所有請求事件處理程序的執行并且請求狀態數據已存儲時發生。 |
![]() | PostRequestHandlerExecute | 在 ASP.NET 事件處理程序(例如,某頁或某個 xml Web service)執行完畢時發生。 |
![]() | PostResolveRequestCache | 在 ASP.NET 跳過當前事件處理程序的執行并允許緩存模塊滿足來自緩存的請求時發生。 |
![]() | PostUpdateRequestCache | 在 ASP.NET 完成緩存模塊的更新并存儲了用于從緩存中為后續請求提供服務的響應后,發生此事件。 |
![]() | PreRequestHandlerExecute | 恰好在 ASP.NET 開始執行事件處理程序(例如,某頁或某個 XML Web services)前發生。 |
![]() | PreSendRequestContent | 恰好在 ASP.NET 向客戶端發送內容之前發生。 |
![]() | PreSendRequestHeaders | 恰好在 ASP.NET 向客戶端發送 HTTP 標頭之前發生。 |
![]() | ReleaseRequestState | 在 ASP.NET 學習交流
熱門圖片
猜你喜歡的新聞
新聞熱點 2019-10-23 09:17:05
2019-10-21 09:20:02
2019-10-21 09:00:12
2019-09-26 08:57:12
2019-09-25 08:46:36
2019-09-25 08:15:43
疑難解答 |