Web API 源码剖析之默认配置(HttpConfiguration)

我们在上一节讲述了全局配置和初始化。本节我们将就全局配置的Configuration只读属性进行展开,她是一个类型为HttpConfiguration。 它在Web Api 主要为整个API 做一些最基础的工作,比如定义默认

  1. 路由表(Routes)
  2. 过滤器(Filters)
  3. 默认消息处理程序(MessageHandlers)
  4. 属性字典(Properties)
  5. 依赖注入解耦器(DependencyResolver)
  6. 错误处理策略(IncludeErrorDetailPolicy)
  7. 服务(Services,这里的服务是之为Web ApI 框架的服务对应的接口和实现)
  8. 媒体格式程序(Formatters)
  9. 参数绑定规则(ParameterBindingRules)。

以上 就是配置的属性。 接下来将就部分属性展开。

Formatters

默认格式化程序,是一个MediaTypeFormatterCollection类型。

API 里定义4个默认格式:

  1. JsonMediaTypeFormatter:对应的是用来处理请求头是application/json或text/json格式,
  2. XmlMediaTypeFormatter:对应的是用来处理请求头是application/xml格式
  3. FormUrlEncodedMediaTypeFormatter:对应的是用来处理请求头是application/x-www-form-urlencoded,
  4. JQueryMvcFormUrlEncodedFormatter

Services

默认服务定义如下:

public DefaultServices(HttpConfiguration configuration) 
       { 
           if (configuration == null) 
           { 
               throw Error.ArgumentNull("configuration"); 
           }

_configuration = configuration;

// Initialize the dictionary with all known service types, even if the list for that service type is 
           // empty, because we will throw if the developer tries to read or write unsupported types.

SetSingle<IActionValueBinder>(new DefaultActionValueBinder()); 
           SetSingle<IApiExplorer>(new ApiExplorer(configuration)); 
           SetSingle<IAssembliesResolver>(new DefaultAssembliesResolver()); 
           SetSingle<IBodyModelValidator>(new DefaultBodyModelValidator()); 
           SetSingle<IContentNegotiator>(new DefaultContentNegotiator()); 
           SetSingle<IDocumentationProvider>(null); // Missing

SetMultiple<IFilterProvider>(new ConfigurationFilterProvider(), 
                                     new ActionDescriptorFilterProvider());

SetSingle<IHostBufferPolicySelector>(null); 
           SetSingle<IHttpActionInvoker>(new ApiControllerActionInvoker()); 
           SetSingle<IHttpActionSelector>(new ApiControllerActionSelector()); 
           SetSingle<IHttpControllerActivator>(new DefaultHttpControllerActivator()); 
           SetSingle<IHttpControllerSelector>(new DefaultHttpControllerSelector(configuration)); 
           SetSingle<IHttpControllerTypeResolver>(new DefaultHttpControllerTypeResolver()); 
           SetSingle<ITraceManager>(new TraceManager()); 
           SetSingle<ITraceWriter>(null);

// This is a priority list. So put the most common binders at the top. 
           SetMultiple<ModelBinderProvider>(new TypeConverterModelBinderProvider(), 
                                       new TypeMatchModelBinderProvider(), 
                                       new KeyValuePairModelBinderProvider(), 
                                       new ComplexModelDtoModelBinderProvider(), 
                                       new ArrayModelBinderProvider(), 
                                       new DictionaryModelBinderProvider(), 
                                       new CollectionModelBinderProvider(), 
                                       new MutableObjectModelBinderProvider()); 
           SetSingle<ModelMetadataProvider>(new DataAnnotationsModelMetadataProvider()); 
           SetMultiple<ModelValidatorProvider>(new DataAnnotationsModelValidatorProvider(), 
                                       new DataMemberModelValidatorProvider());

// This is an ordered list,so put the most common providers at the top. 
           SetMultiple<ValueProviderFactory>(new QueryStringValueProviderFactory(), 
                                          new RouteDataValueProviderFactory());

ModelValidatorCache validatorCache = new ModelValidatorCache(new Lazy<IEnumerable<ModelValidatorProvider>>(() => this.GetModelValidatorProviders())); 
           SetSingle<IModelValidatorCache>(validatorCache);

SetSingle<IExceptionHandler>(new DefaultExceptionHandler()); 
           SetMultiple<IExceptionLogger>();

_serviceTypesSingle = new HashSet<Type>(_defaultServicesSingle.Keys); 
           _serviceTypesMulti = new HashSet<Type>(_defaultServicesMulti.Keys);

// Reset the caches and the known dependency scope 
           ResetCache(); 
       }

默认的Action绑定规则:ParameterBindingRules

ParameterBindingRules = DefaultActionValueBinder.GetDefaultParameterBinders();

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

Web API 源码剖析之默认配置(HttpConfiguration)的更多相关文章

  1. Web API 源码剖析之默认消息处理程序链之路由分发器(HttpRoutingDispatcher)

    Web API 源码剖析之默认消息处理程序链-->路由分发器(HttpRoutingDispatcher) 我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的 ...

  2. Web API 源码剖析之全局配置

    Web API 源码剖析之全局配置 Web API  均指Asp.net Web API .本节讲述的是基于Web API 系统在寄宿于IIS. 本节主要讲述Web API全局配置.它是如何优雅的实现 ...

  3. Web API 源码剖析之默认消息处理程序链--》路由分发器(HttpRoutingDispatcher)

    我们在上一节讲述了默认的DefaultServer(是一个类型为HttpServer的只读属性,详情请参考 Web API 源码剖析之全局配置).本节将讲述DefaultHandler(是一个Http ...

  4. Web API源码剖析之HttpServer

    Web API源码剖析之HttpServer 上一节我们讲述全局配置.本节将讲述全局配置的DefaultServer,它是一个HttpServer类型. 主要作用就是接受每一次请求,然后分发给消息处理 ...

  5. Web Api源码(路由注册)

    这篇文章只是我学习Web API框架的输出,学习方法还是输出倒逼输入比较行得通,所以不管写的好不好,坚持下去,肯定有收获.篇幅比较长,仔细思考阅读下来大约需要几分钟. 做.NET开发有好几年时间了,从 ...

  6. STL源码剖析之空间配置器

    本文大致对STL中的空间配置器进行一个简单的讲解,由于只是一篇博客类型的文章,无法将源码表现到面面俱到,所以真正感兴趣的码农们可以从源码中或者<STL源码剖析>仔细了解一下. 1,为什么S ...

  7. 《STL源码剖析》环境配置

    首先,去侯捷网站下载相关文档:http://jjhou.boolan.com/jjwbooks-tass.htm. 这本书采用的是Cygnus C++ 2.91 for windows.下载地址:ht ...

  8. 长期作业:web框架源码剖析

    Tornado框架 1.1. 手动安装 1.2. 从简单的开始:分析红框部分的源码 Django框架

  9. WorldWind源码剖析系列:配置载入器类ConfigurationLoader

    配置载入器类ConfigurationLoader主要从指定的路径中加载保存星球相关参数的xml文件,从中读取数据来构造星球对象及其所关联的可渲染子对象列表并返回.该类的类图如下所示. 该类所包含的主 ...

随机推荐

  1. Redis学习第五课:Redis Set类型及操作

    Set是集合,它是string类型的无序集合.set是通过hash table实现的,添加.删除和查找的复杂度都是O(1). 对集合我们可以取并集.交集.差集.通过这些操作我们可以实现SNS中的好友推 ...

  2. HDU 2181 哈密顿绕行世界问题(DFS)

    Problem Description 一个规则的实心十二面体,它的 20个顶点标出世界著名的20个城市,你从一个城市出发经过每个城市刚好一次后回到出发的城市. Input 前20行的第i行有3个数, ...

  3. python opencv —— 背景提取(MOG、KNN)、识别与检测(Haar Cascade)

    注意 opencv 的坐标轴,x 轴向右,和 width 对应,y 轴向下,和 height 对应: 1. MOG2 与 KNN MOG:Mixture of Gaussian import cv2 ...

  4. OpenCV代码提取:遍历指定目录下指定文件的实现

    前言 OpenCV 3.1之前的版本,在contrib目录下有提供遍历文件的函数,用起来比较方便.但是在最新的OpenCV 3.1版本给去除掉了.为了以后使用方便,这里将OpenCV 2.4.9中相关 ...

  5. Python学习-终端字体高亮显示

    1.采用原生转义字符序列,对Windows有的版本不支持(比如win7),完美支持Linux 实现过程: 终端的字符颜色是用转义序列控制的,是文本模式下的系统显示功能,和具体的语言无关. 转义序列是以 ...

  6. 《DSP using MATLAB》Problem 4.4

  7. 虚拟机CentOS的NAT模式联网和SecureCRT远程登录管理工具

    Cenos7 发生了很大的变化,不过也是直接配置网络,从启网卡,从启机器,crt链接 https://blog.csdn.net/gebitan505/article/details/54584213 ...

  8. 磁盘 -> 硬盘 -> c盘 && 内存

    磁盘是计算机的外部存储器,分为两类,一类是硬盘,一类是软盘. (附:计算机的存储器有两类,一类是内部存储器(内存条是用半导体材料做成的),断电不会保存当前工作:一类是外部存储器,断了电也能可以保存.) ...

  9. day27 python学习 logging

    logging模块 函数式简单配置 import logging logging.debug('debug message') logging.info('info message') logging ...

  10. 关于 Javascript 严格模式下多文件合并时注意

    Javascript 在第一行使用 "use strict" 声明严格模式. 但是在多个 js 文件合并时就需要注意了,可能你的是严格模式,但别的文件不是,就会造成错误. 为什么使 ...