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