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.準備向客戶端傳送請求體資料
最後上一張整體的圖吧