• Web API 源码剖析之默认消息处理程序链--》路由分发器(HttpRoutingDispatcher)


    我们在上一节讲述了默认的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。

  • 相关阅读:
    人月神话第二遍(总)--读书笔记
    Python实现人脸检测(个人、多人、视频)
    软件体系架构的质量属性
    jdk1.8 使用的是什么垃圾回收器?
    【深入理解Java虚拟机】垃圾回收
    P2167 [SDOI2009]Bill的挑战
    二项式反演基础
    P5039 [SHOI2010]最小生成树
    快速莫比乌斯/沃尔什变换 (FMT/FWT)
    莫比乌斯反演
  • 原文地址:https://www.cnblogs.com/DripRoad/p/6160641.html
Copyright © 2020-2023  润新知