我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的只读属性,详情请参考 Web API 源码剖析之全局配置)。本节将讲述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.

下面将继续讲解剖析HttpControllerDispatcher。

最新文章

  1. 利用Maple推导向量方程的微分公式
  2. c 语言结构体的三种定义方式
  3. Hibernate中的PO
  4. Liunx0000(初步认识)
  5. codevs3013单词背诵
  6. 读改善c#代码157个建议:建议10~12
  7. Spring入门学习(一)
  8. google和oracle闹掰,Java 会不会被抛弃?
  9. 从 MVC 到前后端分离
  10. 利用canvas实现刮刮乐效果
  11. 微信小程序简单介绍 一
  12. 使用docker查看jvm状态,在docker中使用jmap,jstat
  13. [20171124]xxd与通配符.txt
  14. System.SerializableAttribute
  15. Android Studio Xposed模块编写(二)
  16. java多线程并发系列之闭锁(Latch)和栅栏(CyclicBarrier)
  17. uva10417 概率DP
  18. 手动博客重定向 https://www.cnblogs.com/kelthuzadx/
  19. oracle_union_operator
  20. C#多样式EXECl导出

热门文章

  1. BZOJ 3529 【SDOI2014】 数表
  2. SpringBoot在启动时的多环境配置以及加载顺序
  3. DWZ 框架详解
  4. How To Use Amazon MWS To Download Unshipped Order Reports
  5. Jbuilder(3300✨)
  6. hdu4990矩阵快速幂
  7. Object.assign()是浅拷贝
  8. 表统计信息(storge)相关
  9. JavaScript---详解scroll
  10. 038——VUE中组件之WEB开发中组件使用场景与定义组件的方式