1 管道模型
1 Asp.Net Web Form管道
請求進入Asp.Net工作進程后,由進程創建HttpWorkRequest對象,封裝此次請求有關的所有信息,然后進入HttpRuntime類進行進一步處理。HttpRuntime通過請求信息創建HttpContext上下文對象,此對象將貫穿整個管道,直到響應結束。同時創建或從應用程序池里初始化一個HttpApplication對象,由此對象開始處理之前注冊的多個HttpModule。之后調用HandlerFactory創建Handler處理程序,最終處理此次請求內容,生成響應返回。
2 ASP.Net MVC 管道
3、Asp.Net Core管道
IHttpModule和IHttpHandler不復存在,取而代之的是一個個中間件(Middleware)。
Server將接收到的請求直接向后傳遞,依次經過每一個中間件進行處理,然后由最后一個中間件處理並生成響應內容后回傳,再反向依次經過每個中間件,直到由Server發送出去。
中間件就像一層一層的“濾網”,過濾所有的請求和相應。這一設計非常適用於“請求-響應”這樣的場景——消息從管道頭流入最后反向流出。
4 .net Core Middleware
Middleware支持Run、Use和Map三種方法進行注冊,下面將展示每一種方法的使用方式。
- Run的這種用法表示注冊的此中間件為管道內的最后一個中間件,由它處理完請求后直接返回。
- 通過Use方法注冊的中間件,如果不調用next方法,效果等同於Run方法。當調用next方法后,此中間件處理完后將請求傳遞下去,由后續的中間件繼續處理。
- Map方法主要通過請求路徑和其他自定義條件過濾來指定注冊的中間件,看起來更像一個路由。
Asp.Net Core框架內置了幾個中間件
4 Asp.net HttpModule
用處:
- 權限認證和授權:每個請求都經過Module,所以做權限認證很好
- URL 轉發
- 發爬蟲
ASP.NET 請求處理過程是基於管道模型的,這個管道模型是由多個HttpModule和HttpHandler組成,ASP.NET 把http請求依次傳遞給管道中各個HttpModule,最終被HttpHandler處理,處理完成后,再次經過管道中的HTTP模塊,把結果返回給客戶端。我們可以在每個HttpModule中都可以干預請求的處理過程。
注意:在http請求的處理過程中,只能調用一個HttpHandler,但可以調用多個HttpModule。
HttpModule生命周期示意圖
5 Asp.net HttpHandler
HttpHandler是asp.net真正處理Http請求的地方。在這個HttpHandler容器中,ASP.NET Framework才真正地對客戶端請求的服務器頁面做出編譯和執行,並將處理過后的信息附加在HTTP請求信息流中再次返回到HttpModule中。
當一個HTTP請求經過HttpModule容器傳遞到HttpHandler容器中時,ASP.NET Framework會調用HttpHandler的ProcessRequest成員方法來對這個HTTP請求進行真正的處理。以一個ASPX頁面為例,正是在這里一個ASPX頁面才被系統處理解析,並將處理完成的結果繼續經由HttpModule傳遞下去,直至到達客戶端。
對於ASPX頁面,ASP.NET Framework在默認情況下是交給System.Web.UI.PageHandlerFactory這個HttpHandlerFactory來處理的。所謂一個HttpHandlerFactory,是指當一個HTTP請求到達這個HttpHandlerFactory時,HttpHandlerFactory會提供出一個HttpHandler容器,交由這個HttpHandler容器來處理這個HTTP請求。
一個HTTP請求都是最終交給一個HttpHandler容器中的ProcessRequest方法來處理的。
可以在一個.ashx文件中實現IHttpHandler