ASP.Net 管道模型 VS Asp.Net Core 管道 總結

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生命周期示意圖

 

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