• Web API 源码剖析之全局配置


    Web API  均指Asp.net Web API 。本节讲述的是基于Web API 系统在寄宿于IIS.

    本节主要讲述Web API全局配置。它是如何优雅的实现这个配置。做过MVC 都知道Global文件来初始化。Web API 本质上也是ASP.NET applications。所以也是在Global定义里一个GlobalConfiguration静态类。该类作用就是初始化ASP.NET applications.如下是GlobalConfiguration的定义。

    //
       // 摘要:
       //     为 ASP.NET 应用程序提供全局 System.Web.Http.HttpConfiguration。
       public static class GlobalConfiguration
       {
           public static HttpConfiguration Configuration { get; }
           public static HttpMessageHandler DefaultHandler { get; }
           //
           // 摘要:
           //     获取全局 System.Web.Http.HttpServer。
           //
           // 返回结果:
           //     全局 System.Web.Http.HttpServer。
           public static HttpServer DefaultServer { get; }

           public static void Configure(Action<HttpConfiguration> configurationCallback);
       }

    其中定义了3个静态只读属性和1个参数是委托类型的方法,供开发人员自己来初始化配置。

    • Configuration 只读属性是HttpConfiguration类型。 用户来定义applications。主要定义一些依赖注入,参数绑定,消息格式程序,路由,过滤器。消息格式化程序,服务(注意这里的服务不是我们在开发中,后台给前台提供服务,而是applications为自己处理请求所需要类型协作集合)等。我们将在后面详细讲述HttpConfiguration。
    • DefaultHandler 是HttpMessageHandler。默认的消息处理程序。我们查看HttpMessageHandler得知,是一个抽象类,这里默认初始化new HttpRoutingDispatcher,其实HttpRoutingDispatcher也是一个消息处理程序,我们称之为路由分发器。它的默认的消息处理终结点,作用是根据路由匹配,如果找到消息处理程序,就处之。否则就将请求分发给HttpControllerDispatcher也是一个消息处理程序,我们称之为控制器分发器。了解过WCF 的同学,对这个应该会很熟悉。我们将在后面详细讲述消息处理程序。
    • DefaultServer 是HttpServer类型。本质上也是一种消息处理程序。因为HttpServer继承于DelegatingHandler,而DelegatingHandler又继承于HttpMessageHandler,后面章节将详细讲述。
    • Configure(Action<HttpConfiguration> configurationCallback),定义了一个参数为HttpConfiguration的委托Action类型,方便在外部配置applications。这是设置非常巧妙的地方。通过反编译工具查看GlobalConfiguration定义使用了延迟加载来实现,代码实现的非常优雅。代码如下:

    //延迟加载

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

    //只读配置属性

    public static HttpConfiguration Configuration 
    {
               get { return _configuration.Value; } 
    }

    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;
                });
    }

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

    下面将继续讲解剖析HttpConfiguration。HttpConfiguration如何初始化?默认配置又是什么?我们该如何来定义自己的配置。

  • 相关阅读:
    Django实战—权限管理系统rbac组件实现
    Django模型层的DateTimeField、DateField字段设置时间格式为显示当前年月日时分秒的时间格式及时区
    mysql数据库删除一条数据之后,主键id不连续的问题解决
    python多继承(super().__init__())、*args和**kwargs、
    Django数据库操作中You are trying to add a non-nullable field 'name' to contact without a default错误处理
    配置等模版
    【SSM】(一)SSM整合-增删改查书籍
    【SpringMVC】(八)使用Ajax前后端传数据&不使用Ajax
    【SpringMVC】@RequestMapping注意点
    leetcode (堆->中级) 264,313,347,373,378,767,1642,973,1673,743,787
  • 原文地址:https://www.cnblogs.com/DripRoad/p/6087321.html
Copyright © 2020-2023  润新知