帶著問題去思考,大家好!
WebAPI核心任務是什么?它的核心機制又是什么?
核心任務是處理HTTP請求并提供適當的回應,
1 訊息流概覽
HTTP訊息流的框架組件大致分2種
- 依靠HTTP訊息獲得背景關系的組件
- 依靠高層編程模型獲得背景關系
第一層組件只依靠來自底層“訊息處理程式”管道的核心HTTP訊息背景關系,
這張圖是訊息處理管道和控制器管道,
依賴高層編程模型的組件不同,這些組件可以訪問并使用編程框架抽象層,
2 訊息處理管道
HttpServer是訊息處理管道的入口,HttpServer呼叫HttpClientFactory的CreatePipeline方法,使用全域和路由配置資料中提供的處理程式,初始化管道,
HttpServer自己派生的DelegatingHandler類,HttpServer成為了訊息處理管道中第一個處理程式,其后是認識多個定制的DelegatingHandler物件組成,這些定制物件注冊在HttpConfiguration中,接著是HttpRoutingDispatcher,最后要么是HttClientFactory.CreatePipline構造的另一個訊息處理管道,要么就是默認的HttpControllerDispatcher
1:HttpServer將HttpClientFactory.CreatePipeline回傳的值賦給自己的InnerHandler屬性,成為管道的第一個節點,
2:呼叫自己的基類SendAsync方法,將控制權移交給下一個處理程式,
管道所有的訊息處理都用這種方式移交
return base.SendAsync(request,cancellationToken)
3:基類DelegatingHanlder直接呼叫物件的InnerHandler的SendAsync方法,物件的內部處理程式在自己的SendAsync方法中處理訊息,最有一個就是將請求分發到控制器實體的處理程式
這是基于任務的異步管道,
分發程式
HttpServer使用HttpRoutingDispatcher的一個實體作為訊息處理程式管道的最后一個節點,它是負責訊息處理管道的最后一個節點,或者默認HttpControllerDispatcher,
HttpControllerDispatcher派生自HttpMessageHandler,HttpMessageHandler無法直接呼叫,HttpRoutingDispatcher將分發程式實體封裝在一個HttpMessageHandler物件中執行,
var invoker=(routeData.Route==null||routeData.Route.Handler==null)?_defaultInvoker:new HttpMessageInvoker(routeData.Route.Handler,disposeHandler:false); return invoker.SendAsync(request,cancellationToken);
HttpControllerDispatcher執行三個任務
- 使用一個實體IHttpControllerSelector介面物件,選擇一個控制器
- 使用一個實體IHttpControllerActivator介面物件,選擇一個控制器的實體,
- 傳入一個控制器背景關系,執行控制器實體
ASP.Net Web Api提供一個默認的實作DefaultIHttpControllerSelector,
- 判斷控制器是否可以從路由資料直接發現,使用基于屬性的路由時,這一條為真
- 檢查控制器名是否有效,如果控制名缺失或者為空字串,404.
- 使用控制器名,在控制器資訊快取中尋找匹配的HttpControllerDescriptor并回傳
3 控制器管道
ApiController處理模型,
ApiController.ExecuteAsync方法內部執行,
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/12.html
標籤:ASP.NET