首页 > 代码库 > 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.

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

Web API 源码剖析之全局配置