Http Request在整個HttpModule中的生命周期圖
廣告:阿里云采購優惠專區
HttpModule對HttpApplication實例進行處理,而HttpApplication有很多事件(對應不同的生命周期),這樣就衍生出HttpModule內部事件機制和生命周期。
一.HttpModule的事件
BeginRequest 指示請求處理開始
AuthenticateRequest 封裝請求身份驗證過程
AuthorizeRequest 封裝檢查是否能利用以前緩存的輸出頁面處理請求的過程
ResolveRequestCache 從緩存中得到相應時候觸發
--------- 建立HttpHandler控制點, 接著處理(HttpHandler已經建立,此后Session可用)--------
AcquireRequestState 加載初始化Session時候觸發
PreRequestHandlerExecute 在Http請求進入HttpHandler之前觸發
HttpHandler.ProcessRequest()
--------- 返回到HttpModule接著處理(HttpHandler生命周期結束,Session失效)--------
PostRequestHandlerExecute 在Http請求進入HttpHandler之后觸發
ReleaseRequestState 存儲Session狀態時候觸發
UpdateRequestCache 更新緩存信息時觸發
EndRequest 在Http請求處理完成的時候觸發
PreSendRequestHenaders 在向客戶端發送Header之前觸發
PreSendRequestConternt 在向客戶端發送內容之前觸發
------------將處理后的數據返回客戶端-------------
說明:
a.BeginRequest和EndRequest分別是HttpModule容器最開始的的和最后的事件;
b.EndRequest之后還會觸發PreSendRequestHeaders事件和PreSendRequestContent事件,這不是在HttpModule外的兩個事件,表示 HttpModule結束,即將開始向Client發送數據。
二.驗證HttpModule生命周期
說明:
a.HttpModule容器會將HttpRequest傳送到HttpHandler容器,這個時間點是ResolveRequestCache事件;
b.HttpModule容器會建立HttpHandler實例作為入口—Session從此生效;
c.觸發AcquireRequestState事件以及PreRequestHandlerExecute事件;
d.HttpModule容器便將對HttpRequest的控制權限轉讓給HttpHandler容器;
e.HttpModule容器處理HttpRequest—使用自身的ProcessRequest方法,將對其控件權又還給HttpModule容器—之后Session失效。
三.利用HttpModule實現終止此次HttpRequest請求
在BeginRequest事件中,使用HttpApplication.CompleteRequest()方法,可以實現當滿足一定條件時終止此次HttpRequest請求。
Application.CompleteRequest();
說明 :
a.對于一個HttpModule,在BeginRequest中終止,但是仍然會調用EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。也可以說是直接跳轉到EndRequest事件,而不會調用這期間的事件;
b.如果有兩個HttpModule,在第一個HttpModule的BeginRequest中終止,僅僅不會調用第二個HttpModule的BeginRequest,但仍然會調用兩個EndRequest事件,以及PreSendRequestHeaders事件和PreSendRequestContent事件。
廣告:阿里云新人采購專場