參考鏈接
ASP.NET CORE 啟動(dòng)過(guò)程及源碼解讀
1 Asp.Net Web Form管道
請(qǐng)求進(jìn)入Asp.Net工作進(jìn)程后,由進(jìn)程創(chuàng)建HttpWorkRequest對(duì)象,封裝此次請(qǐng)求有關(guān)的所有信息,然后進(jìn)入HttpRuntime類進(jìn)行進(jìn)一步處理。HttpRuntime通過(guò)請(qǐng)求信息創(chuàng)建HttpContext上下文對(duì)象,此對(duì)象將貫穿整個(gè)管道,直到響應(yīng)結(jié)束。同時(shí)創(chuàng)建或從應(yīng)用程序池里初始化一個(gè)HttpApplication對(duì)象,由此對(duì)象開(kāi)始處理之前注冊(cè)的多個(gè)HttpModule。之后調(diào)用HandlerFactory創(chuàng)建Handler處理程序,最終處理此次請(qǐng)求內(nèi)容,生成響應(yīng)返回。
流程圖:
Asp.net HttpModule
用處:
- 權(quán)限認(rèn)證和授權(quán):每個(gè)請(qǐng)求都經(jīng)過(guò)Module,所以做權(quán)限認(rèn)證很好
- URL 轉(zhuǎn)發(fā)
- 發(fā)爬蟲(chóng)
ASP.NET 請(qǐng)求處理過(guò)程是基于管道模型的,這個(gè)管道模型是由多個(gè)HttpModule和HttpHandler組成,ASP.NET 把http請(qǐng)求依次傳遞給管道中各個(gè)HttpModule,最終被HttpHandler處理,處理完成后,再次經(jīng)過(guò)管道中的HTTP模塊,把結(jié)果返回給客戶端。我們可以在每個(gè)HttpModule中都可以干預(yù)請(qǐng)求的處理過(guò)程。
注意:在http請(qǐng)求的處理過(guò)程中,只能調(diào)用一個(gè)HttpHandler,但可以調(diào)用多個(gè)HttpModule。
HttpModule生命周期示意圖
Asp.net HttpHandler
HttpHandler是asp.net真正處理Http請(qǐng)求的地方。在這個(gè)HttpHandler容器中,ASP.NET Framework才真正地對(duì)客戶端請(qǐng)求的服務(wù)器頁(yè)面做出編譯和執(zhí)行,并將處理過(guò)后的信息附加在HTTP請(qǐng)求信息流中再次返回到HttpModule中。
當(dāng)一個(gè)HTTP請(qǐng)求經(jīng)過(guò)HttpModule容器傳遞到HttpHandler容器中時(shí),ASP.NET Framework會(huì)調(diào)用HttpHandler的ProcessRequest成員方法來(lái)對(duì)這個(gè)HTTP請(qǐng)求進(jìn)行真正的處理。以一個(gè)ASPX頁(yè)面為例,正是在這里一個(gè)ASPX頁(yè)面才被系統(tǒng)處理解析,并將處理完成的結(jié)果繼續(xù)經(jīng)由HttpModule傳遞下去,直至到達(dá)客戶端。
對(duì)于ASPX頁(yè)面,ASP.NET Framework在默認(rèn)情況下是交給System.Web.UI.PageHandlerFactory這個(gè)HttpHandlerFactory來(lái)處理的。所謂一個(gè)HttpHandlerFactory,是指當(dāng)一個(gè)HTTP請(qǐng)求到達(dá)這個(gè)HttpHandlerFactory時(shí),HttpHandlerFactory會(huì)提供出一個(gè)HttpHandler容器,交由這個(gè)HttpHandler容器來(lái)處理這個(gè)HTTP請(qǐng)求。
一個(gè)HTTP請(qǐng)求都是最終交給一個(gè)HttpHandler容器中的ProcessRequest方法來(lái)處理的。
可以在一個(gè).ashx文件中實(shí)現(xiàn)IHttpHandler
ASP.Net 管道模型 VS Asp.Net Core 管道 總結(jié)
https://blog.51cto.com/u_15162069/2748151
2 Asp.Net Core管道
IHttpModule和IHttpHandler不復(fù)存在,取而代之的是一個(gè)個(gè)中間件(Middleware)。
Server將接收到的請(qǐng)求直接向后傳遞,依次經(jīng)過(guò)每一個(gè)中間件進(jìn)行處理,然后由最后一個(gè)中間件處理并生成響應(yīng)內(nèi)容后回傳,再反向依次經(jīng)過(guò)每個(gè)中間件,直到由Server發(fā)送出去。
中間件就像一層一層的“濾網(wǎng)”,過(guò)濾所有的請(qǐng)求和相應(yīng)。這一設(shè)計(jì)非常適用于“請(qǐng)求-響應(yīng)”這樣的場(chǎng)景——消息從管道頭流入最后反向流出。
由一個(gè)個(gè)中間件組成形同http請(qǐng)求管道, 每一個(gè)中間件都會(huì)做不同的http處理,最后反向流出。
官方實(shí)例中間件流程文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-444725.html
例如:asp.net core MVC 是核心組件 , mvc對(duì)應(yīng)的請(qǐng)求映射到控制器-action等文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-444725.html
到了這里,關(guān)于Asp.Net VS ASP.NET Core 請(qǐng)求管道的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!