WebApi-控制器路由

帶着問題去思考,你們好!編程

WebAPI核心任務是什麼?它的核心機制又是什麼?緩存

核心任務是處理HTTP請求並提供適當的響應。框架

1  消息流概覽異步

HTTP消息流的框架組件大體分2種spa

  • 依靠HTTP消息得到上下文的組件
  • 依靠高層編程模型得到上下文

第一層組件只依靠來自底層「消息處理程序」管道的核心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執行三個任務

  • 使用一個實例IHttpControllerSelector接口對象,選擇一個控制器
  • 使用一個實例IHttpControllerActivator接口對象,選擇一個控制器的實例。
  • 傳入一個控制器上下文,執行控制器實例

ASP.Net Web Api提供一個默認的實現DefaultIHttpControllerSelector,

  • 判斷控制器是否能夠從路由數據直接發現,使用基於屬性的路由時,這一條爲真
  • 檢查控制器名是否有效,若是控制名缺失或者爲空字符串,404.
  • 使用控制器名,在控制器信息緩存中尋找匹配的HttpControllerDescriptor並返回

3  控制器管道

ApiController處理模型。

 

 ApiController.ExecuteAsync方法內部執行。

相關文章
相關標籤/搜索