Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)
我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的只读属性)。本节将讲述DefaultHandler(是一个HttpMessageHandler的只读属性)。在Web API 里默认是的一个HttpRoutingDispatcher类型,它继承于HttpMessageHandler。我们称之为路由分发器。它主要作用就是将处理从HttpServer传递过来的请求。然后再将请求传递给HttpControllerDispatcher,它继承于HttpMessageHandler。我们称之为控制器分发器。
路由分发器的处理流程规则是如下:
- 首先是从请求获取路由数据,若没有,执行2;
- 从全局路由配置里获取路由数据。若没有,执行3;否则添加到请求路由字典里,以备本次请求的其他地方使用。
- 此时,路由数据仍然为空或者路由数据的默认消息处理程序包括StopRoutingHandler,则提示,停止查找,则判路由失败,返回到UI。否则执行4
- 此时是否有默认消息处理程序,没有则调用HttpControllerDispatcher。然后执行消息委托调用,将请求转发给HttpControllerDispatcher。
具体代码实现如下:
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
// Lookup route data, or if not found as a request property then we look it up in the route table
IHttpRouteData routeData = request.GetRouteData();
if (routeData == null)
{
routeData = _configuration.Routes.GetRouteData(request);
if (routeData != null)
{
request.SetRouteData(routeData);
}
}if (routeData == null || (routeData.Route != null && routeData.Route.Handler is StopRoutingHandler))
{
request.Properties.Add(HttpPropertyKeys.NoRouteMatched, true);
return Task.FromResult(request.CreateErrorResponse(
HttpStatusCode.NotFound,
Error.Format(SRResources.ResourceNotFound, request.RequestUri),
SRResources.NoRouteData));
}routeData.RemoveOptionalRoutingParameters();
// routeData.Route could be null if user adds a custom route that derives from System.Web.Routing.Route explicitly
// and add that to the RouteCollection in the web hosted case
var invoker = (routeData.Route == null || routeData.Route.Handler == null) ?
_defaultInvoker : new HttpMessageInvoker(routeData.Route.Handler, disposeHandler: false);
return invoker.SendAsync(request, cancellationToken);
}
以上就是路由处理规则。其中路由分发器的默认控制器分发器是:HttpControllerDispatcher。其定义如下:
public HttpRoutingDispatcher(HttpConfiguration configuration)
: this(configuration, new HttpControllerDispatcher(configuration))
{
}
以上就是路由分发器的全部内容。
有兴趣的朋友可以下载web Api 源码查看。http://aspnetwebstack.codeplex.com/wikipage?title=Contributors.
转载于:https://www.cnblogs.com/lenmom/p/8509344.html
Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)相关推荐
- Asp.net web Api源码分析-HttpParameterBinding
接着上文Asp.net web Api源码分析-Filter 我们提到filter的获取和调用,后面通过HttpActionBinding actionBinding = actionDescript ...
- Web bench源码剖析
一.Web bench是什么? 首先提一个概念--压力测试. 在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响 ...
- java注解返回不同消息,SpringMVC源码剖析5:消息转换器HttpMessageConverter与@ResponseBody注解...
转自 [SpringMVC关于json.xml自动转换的原理研究[附带源码分析]](https://www.cnblogs.com/fangj... 部分代码会放在我的的Github:https:// ...
- SpringMVC源码剖析(五)-消息转换器HttpMessageConverter
概述 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制,就是Spring3.x中新 ...
- dispatcherservlet发送2次请求_Spring源码分析(三):MVC请求分发器DispatcherServlet设计实现...
概述 DispatcherServlet是SpringMVC的一个前端控制器,是MVC架构中的C,即controller的实现,用于拦截这个web应用的所有请求,具体为在web.xml中配置这个ser ...
- Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager
8.初始化管理器BlockManager 无论是Spark的初始化阶段还是任务提交.执行阶段,始终离不开存储体系.Spark为了避免Hadoop读写磁盘的I/O操作成为性能瓶颈,优先将配置信息.计算结 ...
- 随机二次元新浪图床api源码
介绍: 随机二次元新浪图床api源码,图片默认均为http,采用新浪图片,高速访问. 有兴趣的小伙伴可以自己替换为更好的图片链接地址. 网盘下载地址: http://kekewangLuo.net/t ...
- Mongoose源码剖析:外篇之web服务器
引言 在深入Mongoose源码剖析之前,我们应该清楚web服务器是什么?它提供什么服务?怎样提供服务?使用什么协议?客户端如何唯一标识web服务器的资源?下面我们抛开Mongoose,来介绍一个we ...
- 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...
老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...
- 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 1...
老李推荐: 第3章2节<MonkeyRunner源码剖析>脚本编写示例: MonkeyDevice API使用示例 上一节我们学习了如何通过MonkeyRunner这个类的静态方法wait ...
最新文章
- 卷积神经网络:VGG16 是基于大量真实图像的 ImageNet 图像库预训练的网络
- Review Python Numpy 数组的初始化和基本操作
- 最长回文子串 hihocode 1032 hdu 3068
- Stm 32 IAP 在线 升级IAP 的 操作
- 【NLP】文本相似度的BERT度量方法
- 基于DDD的.NET开发框架 - ABP模块设计
- python查询模块路径_Visual Studio 2017中的Python无法通过“搜索路径”查找模块
- matplotlib 显示批量图片_matplotlib入门
- 提高页面渲染速度的建议以及方案
- 一张图详解互联网产品项目管理流程实例
- 计算机两个基准键用户来定位,键盘与指法基准键位练习
- mcgs组态软件中字体如果从左到右变化_MCGS脚本程序 (2)
- windows下.bat文件启动多个jar文件 (.bat 批量启动jar)
- linux ping 某个端口,linux 怎么ping 端口
- AutoJs学习-QQ批量加好友
- 将multisim中波形在matlab中输出
- 【关机程序】如何用代码实现关机
- UE4蓝图版简易背包系统
- Android Native报错定位(addr2line工具的使用)
- 线性代数学习笔记——第三十二讲——向量混合积的概念与性质
热门文章
- word中填充效果锁定纵横比_操作基础知识Word文字编辑
- win7工作组无法查看计算机名,win7系统无法查看工作组计算机怎么解决
- out.print 嵌套html代码_代码规范之前端编写码规范
- java 比较器_java比较器简略叙述
- 如何全局使用php composer,php – 如何配置要全局安装的composer包?
- 【学习笔记】堆的定义及其建立、排序等基本操作的实现
- 翻译:使用 AWS Deep Racer 的日志分析工具
- 阿里云云计算 13 OSS的优势和使用场景
- 机器学习 Machine Learning- 吴恩达Andrew Ng 第21~25课总结
- 翻译: Python range 函数指南 -- 从入门到精通