ASP.NET Web API: 宿主(Hosting)
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 方法,这个方法中有机会在创建通道堆栈之前修改绑定配置。
作者: 自由、创新、研究、探索……
出处: http://shanyou.cnblogs.com/
版权:本文版权归作者和博客园共有
转载:欢迎转载,为了保存作者的创作热情,请按要求【转载】,谢谢
要求:未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任
绿色通道: 好文要顶 已关注 收藏该文 与我联系
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于ASP.NET Web API: 宿主(Hosting)的详细内容...