ASP.NET Web API 框架研究 Web Host模式下的消息处理管道
寄宿的作用是开启一个进程为Web API提供一个运行环境以解决持续监听、请求监听和响应回复,即将接收到的请求转换成HttpRequestMessage对象传入管道,并将管道生成并经过处理后的HttpResponseMessage回复给客户端。寄宿模式分两种,即Web Host模式和Self Host模式,不同模式下采用的机制不一样,我们先来看看Web Host模式下的消息处理管道。
由前几篇可知,在Web Host模式下,是开启一个ASP.NET Web应用作为Web API的宿主,它借助ASP.NET自身的管道结合IIS解决持续监听、请求接收和响应回复,虽然ASP.NET Web API有自己的路由系统,而且在消息处理管道末端的处理器HttpRoutingDispatcher也具有WebAPI自身的路由解析功能,但采用的还是ASP.NET的路由解析功能,其是利用ASP.NET管道中名称为UrlRoutingModule的ASP.NET的HttpModule来完成,通过注册HttpAppliction的PostResolveRequestCache事件来对请求进行拦截,在其事件处理程序中,借助注册的路由对请求URL进行解析得到路由变量并创建RouteData对象,再从匹配的Route对象中获取对应HttpHandler,而在Web Host模式下往Web API路由表中注册一个HttpRoute对象时候,自动会在ASP.NET路由系统的路由表中注册一个HttpWebRoute类型的Route对象,而HttpWebRoute的RouteHandler固定默认指定为HttpControllerRouteHandler,其GetHandler方法创建并返回 返回一个名为HttpControllerHandler的HttpHandler,GetHandler方法的参数是封装了请求上下文和解析出来的路由数据的RequestContext对象,回l顾下ASP.NET 路由那篇的代码,如下图:

那为啥是这个HttpControllerRouteHandler和HttpControllerHandler呢,回顾下Web Host模式下的路由那篇的代码,如下图 :

以及

而这个HttpControllerHandler会将请求接入到消息处理管道,ASP.NET路由系统就是通过其把ASP.NET管道与ASP.NET Web API消息处理管道进行连通,在其构造函数中,指定了解析的路由数据RouteData,以及GlobalConfiguration提供的默认指定的消息处理管道第一个处理器HttpServer,再看如下代码片段:

以及GlobalConfiguration的代码段:

而HttpControllerHandler的处理方法ProcessRequestAsync起到核心作用,主要有以下几点
- 创建HttpRequestMessage对象
- 把路由数据存放到HttpRequestMessage对象的属性字典中
- 执行HttpServer的SendAsync方法,启动消息处理管道

进入消息处理管道后第一个处理器是HttpServer,我们再回过头看下GlobalConfiguration的创建HttpServer的代码,

而在HttpServer调用SendAync方法时候,会先根据HttpConfiguration里的所有自定义处理器集合以及消息管道的最后一个消息处理器HttpRoutingDispatcher通过InnerHandler属性创建好链式的消息处理管道,如下图



然后,调用以下方法启动管道链式处理:

最后,请求到达了管道中的最后一个消息处理器HttpRoutingDispatcher,由上篇已经说明,其主要有两个作用:
- 路由:如果当前请求中不存在路由数据,就会直接解析进而生成封装路由数据的HttpRouteData
- 消息分发:将请求直接分发给在创建时候指定的HttpControllerDispatcher进一步处理
显然,在前边的HttpControllerHandler的处理方法里已经将路由数据存放到了HttpRequestMessage的属性字典中,所以,这里只需要从请求中获取路由数据,而不需要去直接解析,而HttpControllerDispatcher(也是继承自HttpMessageHandler)是在HttpRoutingDispatcher的构造函数中默认指定的,后续的HttpController激活、Action的执行等操作都是它来执行。


ASP.NET Web API 框架研究 Web Host模式下的消息处理管道的更多相关文章
- ASP.NET Web API 框架研究 Self Host模式下的消息处理管道
Self Host模式下的ASP.NET Web API与WCF非常相似,都可以寄宿在任意类型的托管应用程序中,宿主可以是Windows Form .WPF.控制台应用以及Windows Servic ...
- ASP.NET Web API 框架研究 Web Host模式路由及将请求转出到消息处理管道
Web Host 模式下的路由本质上还是通过ASP.NET 路由系统来进行路由的,只是通过继承和组合的方式对ASP.NET路由系统的内部的类进行了一些封装,产生自己专用一套类结构,功能逻辑基本都是一样 ...
- ASP.NET Web API 框架研究 ASP.NET Web API 路由
ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...
- ASP.NET Web API 框架研究 Controller实例的销毁
我们知道项目中创建的Controller,如ProductController都继承自ApiController抽象类,其又实现了接口IDisposable,所以,框架中自动调用Dispose方法来释 ...
- ASP.NET Web API 框架研究 核心的消息处理管道
ASP.NET Web API 的核心框架是一个由一组HttpMessageHandler有序组成的双工消息处理管道:寄宿监听到请求接受后,把消息传入该管道经过所有HttpMessageHandler ...
- ASP.NET Web API 框架研究 ASP.NET 路由
ASP.NET Web API 如果采用Web Host方式来寄宿,在请求进入Web API 消息处理管道之前,就会用ASP.NET 自身的路由系统根据注册的路由表,解析出当前请求的HttpContr ...
- ASP.NET Web API 框架研究 Action方法介绍
在根据请求解析出匹配的Controller类型并创建实例后,要在该Controller类型中的众多Action方法中选择与请求匹配的那一个,并执行,然后返回响应. Action方法,其元数据,主要包括 ...
- ASP.NET Web API 框架研究 服务容器 ServicesContainer
ServicesContainer是一个服务的容器,可以理解为—个轻量级的IoC容器,其维护着一个服务接口类型与服务实例之间的映射关系,可以根据服务接口类型获取对应的服务实例.构成ASP.NET We ...
- ASP.NET Web API 框架研究 IoC容器 DependencyResolver
一.概念 1.IoC(Inversion of Control),控制反转 即将依赖对象的创建和维护交给一个外部容器来负责,而不是应用本身.如,在类型A中需要使用类型B的实例,而B的实例的创建不是由A ...
随机推荐
- MacDev.GetArchOfLibrary
1. static library How to check target architecture of a static library http://changhoward.blogspot.c ...
- 一种基于URL数据源的WEB报表插件
完全支持所见所得的报表设计, 支持 PHP ,Java 等所有支持JSON格式的后端. 立即下载测试版本 需要正式版本?请QQ联系:1565498246 或者留言
- SQL截取字符串分隔符中间部门的办法
需求:实际项目中需要截取第2到第3个逗号中间部分的内容 方案: declare @str nvarchar(50);set @str='11,222,3333,44444';select @str a ...
- linux下导入导出数据库
导入导出数据库用mysqldump命令,使用方法与mysql命令类似. 导出 导出sql(包含数据和表结构):mysqldump -uroot -p dbname > dbname.sql 导出 ...
- 52.tableViewCell重用机制避免重复显示问题
表刷新超出页面显示的内容会重复出现 -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSInd ...
- css扩大超链接的点击范围
给a标签设置display:block后,它会根据盒模型计算a标签的实际大小.这时候,你可以使用hover伪类使a的整个盒模型生效..link a{display:block;padding:2px ...
- Codeforces Round #543 (Div. 2) D 双指针 + 模拟
https://codeforces.com/contest/1121/problem/D 题意 给你一个m(<=5e5)个数的序列,选择删除某些数,使得剩下的数按每组k个数以此分成n组(n*k ...
- ubuntu上安装win7系统(64位的)
http://www.linuxidc.com/Linux/2012-11/74195.htm deb文件在ubuntu上直接用dpkg -i xxx.deb 如果虚拟机上只显示32位,则可能是cpu ...
- php检测服务器是否可用 不可用发动钉钉消息
<?php set_time_limit(0); //ping一个IP地址,能不能通 function ping($ip) { $ip_port = explode(':', $ip); // ...
- BT656与BT1120的区别
从ITU-R BT1120文档上可知,BT1120支持的是1080p: 文档定义一帧为1 125 总行数和1 080 有效行:每行有效像素为1920图像频率60. 50. 30. 25 和 24H ...