zoukankan      html  css  js  c++  java
  • Web API 源码剖析之全局配置

    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.

  • 相关阅读:
    linux下rm -r误删NTFS文件恢复方法
    svn在linux下的使用(svn命令行)ubuntu 删除 新增 添加 提交 状态查询 恢复
    软件设计师考试历年试题汇总
    强大全面的C++框架和库推荐!
    maven install的时候把源码一起放到仓库
    eclipse手动添加本地jar包到本地maven仓库
    JAVA_SWT 事件的四种写法
    java匿名内部类new(){}
    利用VS2010开发一个跳转页面aspx
    Oracle数据库导入dmp文件报错处理方法
  • 原文地址:https://www.cnblogs.com/lenmom/p/8509319.html
Copyright © 2011-2022 走看看