天天看點

[譯] ASP.NET 生命周期 – ASP.NET 請求生命周期(二)ASP.NET 請求生命周期了解請求生命周期

全局應用類也可以用來跟蹤每個獨立請求的生命周期,包括請求從 ASP.NET 平台傳遞到 MVC 架構。ASP.NET 架構會建立一個定義在 Global.asax 檔案中的 MvcApplication 類的執行個體,并使用它當中定義的事件來引導請求,直到産生響應并發送到浏覽器中。這些事件并不直接供應用開發者使用,它們是供 ASP.NET 架構執行請求處理的。

請求生命周期是由一系列事件描述的,而這些事件描述了一個請求從接收到響應發出的整個過程。在我們建立自己的子產品或者處理器的時候,我們就會使用到這些事件,我們也可以使用這些事件來調試因 ASP.NET 元件之間互動引起的複雜問題。MVC 架構中包含了一個子產品和一個處理器。子產品是用來阻塞請求來檢視檔案,處理器是用來定位 controller 和 action 方法的元件。

Application_Start 和 Application_End 方法并不會在 MvcApplication 執行個體中被調用。相反,ASP.NET 架構會觸發一系列的事件,這些事件用來描述 請求生命周期 :

名稱

描述

BeginRequest

當新的請求接收到時觸發的第一個事件。

AuthenticateRequest

PostAuthenticateRequest

在核實誰目前請求的使用者的時候,AuthenticateRequest 事件會被觸發。當所有的事件處理器處理完之後,PostAuthenticateRequest 會被觸發。

AuthorizeRequest

PostAuthorizeRequest

在授權請求的時候會觸發 AuthorizeRequest。當所有的事件處理器處理完成之後,PostAuthorizeRequest 會觸發。

ResolveRequestCache

PostResolveRequestCache

當從緩存的資料中解析請求的時候會觸發 ResolveRequestCache。當事件處理器處理完成之後,會觸發 PostResolveRequestCache 事件。

MapRequestHandler

PostMapRequestHandler

當 ASP.NET 架構想要為請求定位一個處理器的時候會觸發 MapRequestHandler 事件。一旦處理器選中之後就會觸發 PostMapRequestHandler 事件。

AcquireRequestState

PostAcquireRequestState

在擷取與目前請求相關的狀态資料(比如會話狀态)的時候觸發 AcquireRequestState 事件。當所有的時間處理器處理完畢之後,PostAcquireRequestState 會被觸發。

PreRequestHandlerExecute

PostRequestHandlerExecute

在處理器被要求處理請求之前和之後立即調用這兩個事件。

ReleaseRequestState

PostReleaseRequestState

當關聯目前請求的狀态資料在請求處理的過程中不再需要的時候就會觸發 ReleaseRequestState。當事件處理器完成請求的時候,PostReleaseRequestState 事件就會觸發。

UpdateRequestCache

在子產品負責緩存并更新它們狀态的時候觸發本事件。

LogRequest

PostLogRequest

這個事件觸發的時候提供了記錄目前請求詳細資訊的機會。當所有的事件處理完成之後,PostLogRequest 會被觸發。

EndRequest

在目前請求處理完畢并且響應準備發送到浏覽器之前觸發這個事件。

PreSendRequestHandlers

僅在 HTTP 封包頭發送到浏覽器之前觸發這個事件。

PreSendRequestContent

在響應封包頭發送出去而響應内容沒有發送到浏覽器之前觸發這個事件。

Error

在錯誤發生的時候會觸發這個事件,這可能發生在請求處理的任何一個節點上。

HttpApplication 對象的請求生命周期:ASP.NET 架構會建立多個 MvcApplication 類的執行個體來處理請求,這些執行個體也可以反複使用以便在它們的生命中可以處理多個請求。ASP.NET 架構有絕對的自由在需要的時候建立 MvcApplication 類的執行個體,在不需要的時候也可以銷毀這些執行個體。這就意味着,我們編寫的全局應用類 必須 能夠讓多個執行個體并存,并且這些執行個體可以在一個時間内用來連續處理多個請求,是以,我們僅需要擔心的就是怎麼存取它們共享的資料對象。

ASP.NET 架構觸發的事件描繪了一個請求的處理生命周期的圖表。我們可以在全局應用類,一個子產品,或者一個處理器中處理這些事件。

接下來,我将會向你展示如何在全局應用類中直接響應請求生命周期的事件。這對于了解生命周期事件是一個很好的開始,但這僅僅适用于簡單的請求上的互動。任何複雜的請求處理功能都傾向于使用很多的生命周期事件,這就意味着全局應用類很快就會變得雜亂不堪。ASP.NET 架構為了解決這樣的問題引入了 子產品,它是一個自包含的類,可以接收到生命周期中的事件并且可以監測和處理請求。許多重要的 ASP.NET 平台服務都依賴于子產品功能來在其生命周期之前能夠預處理請求。舉個例子,比如狀态資料與安全服務,需要使用到子產品來響應事件,比如 AcquireRequestState 和 AuthencticateRequest 會在 MVC 架構處理這個請求之前為其添加資料。子產品可以與請求進行互動,包括與其相關聯的響應——生命周期中的任何一個節點。

ASP.NET 架構同樣支援一個元件叫做 處理器。處理器負責給一個請求生成對應的響應。處理器對于 MVC 架構就是負責定位 controller 和 action 方法來服務請求并渲染 action 方法指定的視圖的子產品。ASP.NET 架構可以支援多個處理器,這就是為什麼可以将多種開發架構混合起來放在一起的原因,比如 MVC, Web API, 和 Web Forms。處理器與四個請求生命周期相關。MapRequestHandler 和 PostMapRequestHandler 事件會分别在為一個請求選中好處理器之前和之後觸發,PreRequestHandlerExecute 和 PostRequestHandlerExecute 事件會分别在要求為目前請求生成一個響應的之前和之後執行。

在這裡介紹子產品和處理器有助于更詳細地描述請求生命周期:

[譯] ASP.NET 生命周期 – ASP.NET 請求生命周期(二)ASP.NET 請求生命周期了解請求生命周期

圖 1 - 向生命周期中添加請求處理過程圖表

不要擔心這很複雜,在解釋了這些事件是怎麼被處理的,多個 ASP.NET 平台服務是怎麼實作的之後,這一切都會變得很明朗。

注意到,全局應用類即會被應用執行個體化,也會被請求生命周期執行個體化。不僅 ASP.NET 架構會建立多個執行個體來同時服務請求,也會建立多個執行個體來支援每一個生命周期。

[根據 Adam Freeman – Pro ASP.NET MVC 5 Platform 選譯]

繼續閱讀