ASP.NET Web API: 宿主(Hosting)
ASP.NET Web API 處理架構(gòu)中介紹了ASP.NET Web API主要有三層組成:宿主(hosting),消息處理管道(message handler pipeline)和控制器處理(controller handling),本篇文章主要介紹宿主(Hosting):包括ASP.NET經(jīng)典管道上的Web Hosting和WCF堆棧的自宿主SelfHosting。
ASP.NET經(jīng)典管道上的Web Hosting
1、ASP.NET 路由使您可以使用不必映射到網(wǎng)站中特定文件的 URL。 由于該 URL 不必映射到文件,因此可以使用對(duì)用戶操作進(jìn)行描述因而更易于被用戶理解的 URL,路由在ASP.NET Web API上一樣有重要的位置。在ASP.NET平臺(tái)上,是通過(guò)RouteTable的靜態(tài)屬性Routes添加路由到路由表里,例如下面的代碼是ASP.NET MVC項(xiàng)目模板默認(rèn)定義的路由:
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,對(duì)每一個(gè)Http請(qǐng)求,這個(gè)模塊在路由集合中匹配符合路由規(guī)則,如果有一個(gè)匹配,則:
- 從Route Data中獲取到一個(gè)route handler
- 從Route Handler中獲取到一個(gè)實(shí)現(xiàn)IHttpHandler接口的Http處理程序
- 最后,當(dāng)前的請(qǐng)求上下文映射到上述Http處理程序
因此,在ASP.NET 管道的最后將請(qǐng)求發(fā)送這個(gè)處理器。
2、集成Web API,當(dāng)宿主與ASP.NET,Web API的配置定義在單件的HttpConfiguration對(duì)象里,通過(guò)靜態(tài)屬性GlobalConfiguration.Configuration訪問(wèn)。Web API還定義了幾個(gè)RouteCollection 擴(kuò)展方法,叫做 MapHttpRoute,用來(lái)定義Web APi的配置。請(qǐng)看下面的示例:
HttpConfiguration config = GlobalConfiguration.Configuration;
config.Routes.MapHttpRoute("default", "{controller}/{id}", new {id = UrlParameter.Optional});
// other configuration settings
上述代碼主要完成2項(xiàng)功能:
- 靜態(tài)屬性GlobalConfiguration.Configuration 用于獲取配置,指向全局的RouteTable.Routes 路由集合。
- 使用MapHttpRoute擴(kuò)展方法添加路由配置。
通過(guò)MapHttpRoute擴(kuò)展方法添加到路由集合的Route Handler是HttpControllerRouteHandler,匹配使用MapHttpRoute添加的請(qǐng)求,相關(guān)的Route Handler返回一個(gè)新的處理器類型 HttpControllerHandler,它實(shí)現(xiàn)了異步IAsyncHttpHandler 接口,這個(gè)處理器使用路由數(shù)據(jù)初始化,包含匹配的信息。
當(dāng)調(diào)用HttpControllerHandler的BeginProcessRequest方法,執(zhí)行下面的動(dòng)作:
- 從當(dāng)前的HttpContext創(chuàng)建一個(gè)HttpRequestMessage 實(shí)例
- 使用GlobalConfiguration.Configuration的配置創(chuàng)建一個(gè)HttpServer,然后把這個(gè)新的HttpRequestMessage 實(shí)例推入服務(wù)器管道。
在HttpServer獲取請(qǐng)求之后,它就進(jìn)入了宿主處理新階段(Web API的新管道)。下面的圖總結(jié)了路由處理過(guò)程和分發(fā)到HttpServer實(shí)例(信息處理的管道)。
基于WCF堆棧的自宿主SelfHosting
上面我們介紹完了在ASP.NET上的Web宿主,接下來(lái)我們來(lái)介紹基于WCF堆棧的自宿主SelfHosting。我們先來(lái)看一段使用自宿主的代碼:
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 作為配置類,類圖結(jié)構(gòu)如下:
在HttpSelfHostServer 內(nèi)部使用的WCF堆棧從傳輸媒體獲取消息然后把他們推送到上層的消息處理管道。下面部分簡(jiǎn)要介紹WCF的高層架構(gòu),Web API自宿主的特征。
WCF架構(gòu)
WCF架構(gòu)主要?jiǎng)澐譃?層,Channel Stack和Service Model,具體看下圖:
較低的通道堆棧層是由一堆通道和行為類似于經(jīng)典的網(wǎng)絡(luò)協(xié)議棧。通道分為兩類:傳輸渠道和協(xié)議的渠道。負(fù)責(zé)傳輸通道由接口與傳輸介質(zhì)(例如TCP,MSMQ,HTTP)(是的,我知道,HTTP不僅僅是一個(gè)傳輸協(xié)議),即由訊息的接收與傳遞。協(xié)議的信息渠道流量過(guò)程上下通過(guò)疊加。一個(gè)典型的使用案例的增加協(xié)議通道數(shù)字簽名在發(fā)送方和驗(yàn)證簽名的人在接收的一面。傳輸通道,使用編碼器轉(zhuǎn)換字節(jié)流和信息輸送介質(zhì)字節(jié)實(shí)例。
上層的Service Model執(zhí)行消息和方法調(diào)用,所處理的人物如下:
- 把收到的消息轉(zhuǎn)換成參數(shù)序列
- 獲取到使用的服務(wù)實(shí)例
- 選擇調(diào)用的方法
- 選擇線程處理調(diào)用的方法
然而HttpSelfHostServer不使用Service Model層,相反,他直接消費(fèi)了從傳輸通道堆棧獲取的消息。傳輸通道堆棧層使用Binding來(lái)組織,如下圖所示:
Binding是一個(gè)有序的Binding Element的集合,每一個(gè)元素描述一個(gè)通道或者編碼器。第一個(gè)Binding Element描述了上層通道,最后一個(gè)Binding Element描述了底層的通道,總之這是一個(gè)傳輸通道。
HttpSelfHostServer 和HttpSelfHostConfiguration 類
在內(nèi)部HttpSelfHostserver.OpenAsync 方法基于HttpSelfHostConfiguration實(shí)例屬性創(chuàng)建和配置創(chuàng)建一個(gè)HttpBinding實(shí)例。然后他利用這個(gè)Binding異步創(chuàng)建一個(gè)WCF傳輸堆棧,他也創(chuàng)建一個(gè)Pump把消息推入這個(gè)堆棧,并轉(zhuǎn)換為HttpRequestMessage 實(shí)例并把新的請(qǐng)求推入HttpServer,下圖是消息的處理流程:
使用自宿主的時(shí)候,大多數(shù)的WCF HTTP binding 約束和設(shè)置都是可用的,在配置的內(nèi)部創(chuàng)建的HttpBinding實(shí)例可以用2種方式創(chuàng)建。第一種是使用HttpSelfHostConfiguration屬性,例如MaxBufferSize 和TransferMode,這些被用于內(nèi)部創(chuàng)建HttpBinding實(shí)例,第二種方法是創(chuàng)建一個(gè)HttpSelfHostConfiguration的子類,然后重寫OnConfigureBinding方法,這個(gè)方法中有機(jī)會(huì)在創(chuàng)建通道堆棧之前修改綁定配置。
ASP.NET WebAPI Hosting Techniques http://www.codeproject.com/Articles/555923/ASP-NET-WebAPI-Hosting-Techniques
歡迎大家掃描下面二維碼成為我的客戶,扶你上云







浙公網(wǎng)安備 33010602011771號(hào)