zoukankan      html  css  js  c++  java
  • Web API源码剖析之HttpServer

    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.

  • 相关阅读:
    unicode utf-8 ascll
    解压赋值。django导读,http协议,
    手撸orm
    优酷oneday 元类单例 多路复用
    前后台交互, 按钮, 输入栏,列表,选项 ,dom
    jq 事件;jq选择器,与js转化,jq操作文档,属性,类名,全局变量;获取盒子信息
    事件补充;对象操作;字符串类型操作;数组操作;数字类型操作
    if结构 ,循环结构,数据类型转换,逻辑运算符;三个弹出窗口;计算后样式获取,修改;函数
    js 引入与选择器;对文档修改;数据类型基础语法;计算后样式
    伪类边框,字体图标,显隐,overflow,阴影,二维变形
  • 原文地址:https://www.cnblogs.com/lenmom/p/8509335.html
Copyright © 2011-2022 走看看