Web API源码剖析之HttpServer

上一节我们讲述全局配置。本节将讲述全局配置的DefaultServer,它是一个HttpServer类型。 主要作用就是接受每一次请求,然后分发给消息处理程序链依次处理。从HttpServer定义可以看出,其本质是一个消息处理程序,其继承于DelegatingHandler。从其代码定义如下:

     //参数为

     public HttpServer(HttpConfiguration configuration, HttpMessageHandler dispatcher);

        // 摘要: 
        //     获取用于配置此实例的 System.Web.Http.HttpConfiguration。 
        // 
        // 返回结果: 
        //     用于配置此实例的 System.Web.Http.HttpConfiguration。 
        public HttpConfiguration Configuration { get; } 
        // 
        // 摘要: 
        //     获取用于处理传入请求的 HTTP 调度程序。 
        // 
        // 返回结果: 
        //     用于处理传入请求的 HTTP 调度程序。 
        public HttpMessageHandler Dispatcher { get; }

公开两个只读属性。

Dispatcher :承担分发中介者,实际上一个 HttpRoutingDispatcher类型。我们回顾一下上一节部分代码:

//以下都使用延迟加载。

private static Lazy<HttpConfiguration> _configuration = CreateConfiguration();

private static Lazy<HttpMessageHandler> _defaultHandler = CreateDefaultHandler();

private static Lazy<HttpServer> _defaultServer = CreateDefaultServer(); 

private static Lazy<HttpConfiguration> CreateConfiguration() 

           return new Lazy<HttpConfiguration>(() => 
           { 
               HttpConfiguration config = new HttpConfiguration(new HostedHttpRouteCollection(RouteTable.Routes)); 
               ServicesContainer services = config.Services; 
               Contract.Assert(services != null); 
               services.Replace(typeof(IAssembliesResolver), new WebHostAssembliesResolver()); 
               services.Replace(typeof(IHttpControllerTypeResolver), new WebHostHttpControllerTypeResolver()); 
               services.Replace(typeof(IHostBufferPolicySelector), new WebHostBufferPolicySelector()); 
               services.Replace(typeof(IExceptionHandler), 
                   new WebHostExceptionHandler(services.GetExceptionHandler())); 
               return config; 
           }); 
}

//默认的消息处理程序,实际就是路由分发器

private static Lazy<HttpMessageHandler> CreateDefaultHandler() 

           return new Lazy<HttpMessageHandler>(() => new HttpRoutingDispatcher(_configuration.Value)); 
}

//这里传递的是路由分发器。

private static Lazy<HttpServer> CreateDefaultServer() 

           return new Lazy<HttpServer>(() => new HttpServer(_configuration.Value, _defaultHandler.Value)); 

以上代码实现了HttpServer的初始化工作。同时他重写了 InnerHandler属性。内部的实现机制是:

将消息处理程序链顺序倒置,依次设置消息处理程序。这样就实现了消息处理程序,先入先出的原理:例如

config.MessageHandlers.Add(new M2DelegatingHandler()); 
config.MessageHandlers.Add(new M1DelegatingHandler());

则是先调用M2DelegatingHandler,然后在调用M1DelegatingHandler,再次调用HttpRoutingDispatcher,最后将委托分发给HttpControllerDispatcher

从上面可以看出HttpServer,大部分工作就是协调作用,分发作用。

有兴趣的朋友可以下载web Api 源码查看。http://aspnetwebstack.codeplex.com/wikipage?title=Contributors.

最新文章

  1. Timer定时任务
  2. UEditor编辑文章出现多余空行问题的解决办法
  3. Appium绑定
  4. 【软件多国语言】一个demo
  5. keil uVision4一些使用总结(汉字注释,C关键字等)
  6. The Embarrassed Cryptographer(高精度取模+同余模定理)
  7. HDOJ 2071 Max Num
  8. C#方法的重载
  9. ios开发之常用宏的定义
  10. MongoDB系列----uupdate和数组
  11. ubuntu16.04 uninstall cuda 9.0 completely and install 8.0 instead
  12. 剑指Offer 3. 从尾到头打印链表 (链表)
  13. Tomcat部署项目定时任务跑了两次
  14. JavaServlet的文件上传和下载
  15. 虚拟机中在centos6.7环境下安装eclipse
  16. python opencv3 获取摄像头视频
  17. [微信开发] - 从最新的appid,appsecret读取配置信息
  18. Win7-U盘安装出现&quot;We were unable to copy your files. &quot;
  19. Class 的继承
  20. DP Intro - poj 1947 Rebuilding Roads(树形DP)

热门文章

  1. 第七届蓝桥杯个人赛省赛--C语言B组
  2. hdu-5810 Balls and Boxes(概率期望)
  3. Windows下C++删除清除map
  4. 20155220 2016-2017-2 《Java程序设计》第九周学习总结
  5. MVC的好处 演示
  6. 带CookieContainer进行post
  7. NASSA&rsquo;s Robot
  8. socat 简单试用
  9. 使用VBS控制声音
  10. Vquery PHP 简单爬虫类