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 源码查看。?title=Contributors.
下面将继续讲解剖析HttpConfiguration。HttpConfiguration如何初始化?默认配置又是什么?我们该如何来定义自己的配置。
Web API 源码剖析之全局配置