標籤:routing 整合 ann color href cti 處理過程 預設 分發
參考頁面:
http://www.yuanjiaocheng.net/webapi/test-webapi.html
http://www.yuanjiaocheng.net/webapi/web-api-controller.html
http://www.yuanjiaocheng.net/webapi/config-webapi.html
http://www.yuanjiaocheng.net/webapi/web-api-route.html
http://www.yuanjiaocheng.net/webapi/parameter-binding.html
ASP.NET Web API 處理架構中介紹了ASP.NET Web API主要有三層組成:宿主(hosting),訊息處理管道(message handler pipeline)和控制器處理(controller handling),本篇文章主要介紹宿主(Hosting):包括ASP.NET經典管道上的Web Hosting和WCF堆棧的自宿主SelfHosting。
ASP.NET經典管道上的Web Hosting
1、ASP.NET 路由使您可以使用不必映射到網站中特定檔案的 URL。 由於該 URL 不必映射到檔案,因此可以使用對使用者操作進行描述因而更易於被使用者理解的 URL,路由在ASP.NET Web API上一樣有重要的位置。在ASP.NET平台上,是通過RouteTable的靜態屬性Routes添加路由到路由表裡,例如下面的代碼是ASP.NET MVC項目模板預設定義的路由:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
大部分的路由邏輯是由UrlRoutingModule附加到ASP.NET 的管道事件PostResolveRequestCache,對每一個Http請求,這個模組在路由集合中匹配符合路由規則,如果有一個匹配,則:
- 從Route Data中擷取到一個route handler
- 從Route Handler中擷取到一個實現IHttpHandler介面的Http處理常式
- 最後,當前的請求上下文映射到上述Http處理常式
因此,在ASP.NET 管道的最後將請求發送這個處理器。
2、整合Web API,當宿主與ASP.NET,Web API的配置定義在單件的HttpConfiguration對象裡,通過靜態屬性GlobalConfiguration.Configuration訪問。Web API還定義了幾個RouteCollection 擴充方法,叫做 MapHttpRoute,用來定義Web APi的配置。請看下面的樣本:
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Routes.MapHttpRoute("default", "{controller}/{id}", new {id = UrlParameter.Optional});
// other configuration settings
上述代碼主要完成2項功能:
- 靜態屬性GlobalConfiguration.Configuration 用於擷取配置,指向全域的RouteTable.Routes 路由集合。
- 使用MapHttpRoute擴充方法添加路由配置。
通過MapHttpRoute擴充方法添加到路由集合的Route Handler是HttpControllerRouteHandler,匹配使用MapHttpRoute添加的請求,相關的Route Handler返回一個新的處理器類型 HttpControllerHandler,它實現了非同步IAsyncHttpHandler 介面,這個處理器使用路由資料初始化,包含匹配的資訊。
當調用HttpControllerHandler的BeginProcessRequest方法,執行下面的動作:
- 從當前的HttpContext建立一個HttpRequestMessage 執行個體
- 使用GlobalConfiguration.Configuration的配置建立一個HttpServer,然後把這個新的HttpRequestMessage 執行個體推入伺服器管道。
在HttpServer擷取請求之後,它就進入了宿主處理新階段(Web API的新管道)。下面的圖總結了路由處理過程和分發到HttpServer執行個體(資訊處理的管道)。
基於WCF堆棧的自宿主SelfHosting
上面我們介紹完了在ASP.NET上的Web宿主,接下來我們來介紹基於WCF堆棧的自宿主SelfHosting。我們先來看一段使用自宿主的代碼:
var config = new HttpSelfHostConfiguration("http://localhost:8080");
config.Routes.MapHttpRoute("default", "{controller}/{id}",
new { id = RouteParameter.Optional });
var server = new HttpSelfHostServer(config);
server.OpenAsync().Wait();
Console.WriteLine("Server is opened");
HttpSelfHostServer 繼承與HttpServer,並使用HttpSelfHostConfiguration 作為配置類,類圖結構如下:
在HttpSelfHostServer 內部使用的WCF堆棧從傳輸媒體擷取訊息然後把他們推送到上層的訊息處理管道。下面部分簡要介紹WCF的高層架構,Web API自宿主的特徵。
WCF架構
WCF架構主要劃分為2層,Channel Stack和Service Model,具體看:
較低的通道堆棧層是由一堆通道和行為類似於經典的網路通訊協定棧。通道分為兩類:傳輸渠道和協議的渠道。負責傳輸通道由介面與傳輸介質(例如TCP,MSMQ,HTTP)(是的,我知道,HTTP不僅僅是一個傳輸協議),即由訊息的接收與傳遞。協議的資訊渠道流量過程上下通過疊加。一個典型的使用案例的增加協議通道數位簽章在發送方和驗證簽名的人在接收的一面。傳輸通道,使用編碼器轉換位元組流和資訊輸送介質位元組執行個體。
上層的Service Model執行訊息和方法調用,所處理的人物如下:
- 把收到的訊息轉換成參數序列
- 擷取到使用的服務執行個體
- 選擇調用的方法
- 選擇線程處理調用的方法
然而HttpSelfHostServer不使用Service Model層,相反,他直接消費了從傳輸通道堆棧擷取的訊息。傳輸通道堆棧層使用Binding來組織,如所示:
Binding是一個有序的Binding Element的集合,每一個元素描述一個通道或者編碼器。第一個Binding Element描述了上層通道,最後一個Binding Element描述了底層的通道,總之這是一個傳輸通道。
HttpSelfHostServer 和HttpSelfHostConfiguration 類
在內部HttpSelfHostserver.OpenAsync 方法基於HttpSelfHostConfiguration執行個體屬性建立和配置建立一個HttpBinding執行個體。然後他利用這個Binding非同步建立一個WCF傳輸堆棧,他也建立一個Pump把訊息推入這個堆棧,並轉換為HttpRequestMessage 執行個體並把新的請求推入HttpServer,是訊息的處理流程:
使用自宿主的時候,大多數的WCF HTTP binding 約束和設定都是可用的,在配置的內部建立的HttpBinding執行個體可以用2種方式建立。第一種是使用HttpSelfHostConfiguration屬性,例如MaxBufferSize 和TransferMode,這些被用於內部建立HttpBinding執行個體,第二種方法是建立一個HttpSelfHostConfiguration的子類,然後重寫OnConfigureBinding方法,這個方法中有機會在建立通道堆棧之前修改綁定配置。
ASP.NET WebAPI Hosting Techniques http://www.codeproject.com/Articles/555923/ASP-NET-WebAPI-Hosting-Techniques
ASP.NET Web API: 宿主(Hosting)