1. 程式人生 > >ASP.NET頁面請求過程及生命週期管道事件

ASP.NET頁面請求過程及生命週期管道事件

Client(傳送報文:請求行+請求頭+空行+請求體) <------ Http 協議 ------> Server,由

Http.sys 監聽 Http 請求 -> WAS+Metabase(通過URL確定WebApp工作程序) ->

W3WP.exe(一個應用程式池,載入Aspnet_IsAPI.dll) ->AppDomainFactory(構造 ApplicationManager)->ISAPIApplicationHost+ISAPIRuntime(由ApplicationManager建立)->

ISAPIWorkerRequest(根據控制代碼記憶體塊封裝Http請求資訊,IIS版本等等)+ HttpRuntime,然後

HttpRuntime 開始接收ISAPIWorkerRequest,並如下進行處理:

建立 HttpContext(包含HttpRequest/HttpResponse等等), 和通過HttpApplicationFactory 獲取或建立HttpApplication(包含HttpContext),

最後執行 HttpApplication 的 ProcessReuqest(...)。在執行過程中,所包含的管道事件,將按順序觸發。

如果某些管道事件在 HttpModule 中有被重新註冊,則執行相應事件處理程式。

//context_xxxxxx 為 asp.net 管道事件,目的是逐步完善HttpContext內容

Application_Start

下面開始管道中的事件:
context_BeginRequest ////1.開始處理請求,httpModule 開始,在這之前所有實現IHttpModule的*.cs,將通過反射載入進來,並對module物件集合進行迭代,執行介面方法 Init(HttpApplication物件),這其實就是Global檔案中的Application_BeginRequest,程式設計師可以最早介入的地方,可以在此做防盜鏈,遮蔽IP等等


context_AuthenticateRequest////2.授權驗證請求,獲取使用者授權資訊


context_PostAuthenticateRequest////3.獲取成功


context_AuthorizeRequest////4.授權,一般來檢查使用者是否獲取許可權


context_PostAuthorizeRequest////5.獲得請求


context_ResolveRequestCache////6.獲取頁面快取結果


context_PostResolveRequestCache////7.已獲取快取    如果是MVC模式,則當前請求對映到MvcHandler


context_PostMapRequestHandler////8.建立頁面物件:建立最終處理當前http請求的handler例項(注意,如果在此之前,使用Context.RemapHandler手動指定了對映到特定的Handler,則不會建立頁面物件處理請求,而是交給指定的Handler,例如MvcHandler)


Session_Start//執行Session


context_AcquireRequestState////9.獲取Session


context_PostAcquireRequestState////10.獲得Session


context_PreRequestHandlerExecute////11.準備執行處理程式,在這之前所有實現IHttpHandler的*.cs,將通過反射載入進來

MyHandler//執行處理程式, 並且開始進入頁面生命週期,對handler物件集合進行迭代,執行介面方法 ProcessRequest(HttpContext物件),注意是執行7 8所提到的被指定的Handler的PR函式

//其實在這之間完整的執行過程是,生成頁面控制元件樹,初始化,載入ViewState,處理回發,觸發事件,渲染頁面等10個事件

下面是我找到的2張圖



context_PostRequestHandlerExecute ////12.已經執行了處理程式


context_ReleaseRequestState////13.釋放請求的狀態


context_PostReleaseRequestState////14.已經釋放了請求狀態


context_UpdateRequestCache////15.更新快取


context_PostUpdateRequestCache////16.已經更新了快取

context_LogRequest////17.請求的日誌操作


context_PostLogRequest;////18.已經完成了請求的日誌操作

context_EndRequest////19.本次請求處理完成,httpModule 結束,這其實就是Global檔案中的Application_EndRequest


context_PreSendRequestHeaders////20.準備向客戶端傳送請求頭資料


context_PreSendRequestContent////21.準備向客戶端傳送請求體資料

最後上一張整體的圖吧