帶着問題去思考,你們好!編程
WebAPI核心任務是什麼?它的核心機制又是什麼?緩存
核心任務是處理HTTP請求並提供適當的響應。框架
1 消息流概覽異步
HTTP消息流的框架組件大體分2種spa
第一層組件只依靠來自底層「消息處理程序」管道的核心HTTP消息上下文。3d
這張圖是消息處理管道和控制器管道。code
依賴高層編程模型的組件不一樣,這些組件能夠訪問並使用編程框架抽象層。對象
2 消息處理管道blog
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執行三個任務
ASP.Net Web Api提供一個默認的實現DefaultIHttpControllerSelector,
3 控制器管道
ApiController處理模型。
ApiController.ExecuteAsync方法內部執行。