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