我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的只读属性)。本节将讲述DefaultHandler(是一个HttpMessageHandler的只读属性)。在Web API 里默认是的一个HttpRoutingDispatcher类型,它继承于HttpMessageHandler。我们称之为路由分发器。它主要作用就是将处理从HttpServer传递过来的请求。然后再将请求传递给HttpControllerDispatcher,它继承于HttpMessageHandler。我们称之为控制器分发器。

路由分发器的处理流程规则是如下:

  1. 首先是从请求获取路由数据,若没有,执行2;
  2. 从全局路由配置里获取路由数据。若没有,执行3;否则添加到请求路由字典里,以备本次请求的其他地方使用。
  3. 此时,路由数据仍然为空或者路由数据的默认消息处理程序包括StopRoutingHandler,则提示,停止查找,则判路由失败,返回到UI。否则执行4
  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)相关推荐

  1. Asp.net web Api源码分析-HttpParameterBinding

    接着上文Asp.net web Api源码分析-Filter 我们提到filter的获取和调用,后面通过HttpActionBinding actionBinding = actionDescript ...

  2. Web bench源码剖析

    一.Web bench是什么? 首先提一个概念--压力测试. 在运维工作中,压力测试是一项很重要的工作.比如在一个网站上线之前,能承受多大访问量.在大访问量情况下性能怎样,这些数据指标好坏将会直接影响 ...

  3. java注解返回不同消息,SpringMVC源码剖析5:消息转换器HttpMessageConverter与@ResponseBody注解...

    转自 [SpringMVC关于json.xml自动转换的原理研究[附带源码分析]](https://www.cnblogs.com/fangj... 部分代码会放在我的的Github:https:// ...

  4. SpringMVC源码剖析(五)-消息转换器HttpMessageConverter

    概述 在SpringMVC中,可以使用@RequestBody和@ResponseBody两个注解,分别完成请求报文到对象和对象到响应报文的转换,底层这种灵活的消息转换机制,就是Spring3.x中新 ...

  5. dispatcherservlet发送2次请求_Spring源码分析(三):MVC请求分发器DispatcherServlet设计实现...

    概述 DispatcherServlet是SpringMVC的一个前端控制器,是MVC架构中的C,即controller的实现,用于拦截这个web应用的所有请求,具体为在web.xml中配置这个ser ...

  6. Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager

    8.初始化管理器BlockManager 无论是Spark的初始化阶段还是任务提交.执行阶段,始终离不开存储体系.Spark为了避免Hadoop读写磁盘的I/O操作成为性能瓶颈,优先将配置信息.计算结 ...

  7. 随机二次元新浪图床api源码

    介绍: 随机二次元新浪图床api源码,图片默认均为http,采用新浪图片,高速访问. 有兴趣的小伙伴可以自己替换为更好的图片链接地址. 网盘下载地址: http://kekewangLuo.net/t ...

  8. Mongoose源码剖析:外篇之web服务器

    引言 在深入Mongoose源码剖析之前,我们应该清楚web服务器是什么?它提供什么服务?怎样提供服务?使用什么协议?客户端如何唯一标识web服务器的资源?下面我们抛开Mongoose,来介绍一个we ...

  9. 老李推荐:第3章3节《MonkeyRunner源码剖析》脚本编写示例: MonkeyImage API使用示例 1...

    老李推荐:第3章3节<MonkeyRunner源码剖析>脚本编写示例: MonkeyImage API使用示例 在上一节的第一个"增加日记"的示例中,我们并没有看到日记 ...

  10. 老李推荐: 第3章2节《MonkeyRunner源码剖析》脚本编写示例: MonkeyDevice API使用示例 1...

    老李推荐: 第3章2节<MonkeyRunner源码剖析>脚本编写示例: MonkeyDevice API使用示例 上一节我们学习了如何通过MonkeyRunner这个类的静态方法wait ...

最新文章

  1. 卷积神经网络:VGG16 是基于大量真实图像的 ImageNet 图像库预训练的网络
  2. Review Python Numpy 数组的初始化和基本操作
  3. 最长回文子串 hihocode 1032 hdu 3068
  4. Stm 32 IAP 在线 升级IAP 的 操作
  5. 【NLP】文本相似度的BERT度量方法
  6. 基于DDD的.NET开发框架 - ABP模块设计
  7. python查询模块路径_Visual Studio 2017中的Python无法通过“搜索路径”查找模块
  8. matplotlib 显示批量图片_matplotlib入门
  9. 提高页面渲染速度的建议以及方案
  10. 一张图详解互联网产品项目管理流程实例
  11. 计算机两个基准键用户来定位,键盘与指法基准键位练习
  12. mcgs组态软件中字体如果从左到右变化_MCGS脚本程序 (2)
  13. windows下.bat文件启动多个jar文件 (.bat 批量启动jar)
  14. linux ping 某个端口,linux 怎么ping 端口
  15. AutoJs学习-QQ批量加好友
  16. 将multisim中波形在matlab中输出
  17. 【关机程序】如何用代码实现关机
  18. UE4蓝图版简易背包系统
  19. Android Native报错定位(addr2line工具的使用)
  20. 线性代数学习笔记——第三十二讲——向量混合积的概念与性质

热门文章

  1. word中填充效果锁定纵横比_操作基础知识Word文字编辑
  2. win7工作组无法查看计算机名,win7系统无法查看工作组计算机怎么解决
  3. out.print 嵌套html代码_代码规范之前端编写码规范
  4. java 比较器_java比较器简略叙述
  5. 如何全局使用php composer,php – 如何配置要全局安装的composer包?
  6. 【学习笔记】堆的定义及其建立、排序等基本操作的实现
  7. 翻译:使用 AWS Deep Racer 的日志分析工具
  8. 阿里云云计算 13 OSS的优势和使用场景
  9. 机器学习 Machine Learning- 吴恩达Andrew Ng 第21~25课总结
  10. 翻译: Python range 函数指南 -- 从入门到精通