帶著問題去思考,大家好! WebAPI核心任務是什麼?它的核心機制又是什麼? 核心任務是處理HTTP請求並提供適當的響應。 1 消息流概覽 HTTP消息流的框架組件大致分2種 依靠HTTP消息獲得上下文的組件 依靠高層編程模型獲得上下文 第一層組件只依靠來自底層“消息處理程式”管道的核心HTTP消息 ...
帶著問題去思考,大家好!
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方法內部執行。