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. fluent nhibernate映射的数值类型问题

    fluent nhibernate中,数值类型设置不当,就可能会引发一些意想不到错误. 一.引发映射错误 比如,oracle数据库中,字段ID类型是number,结果用codesmith生成代码,实体 ...

  2. 1.1.4 A+B for Input-Output Practice (V)

    A+B for Input-Output Practice (V) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K ...

  3. tomcat版本号的修改

    我的是8.5.0我将其改为8.0.0    其他版本改也是一样      我改这个版本号就是因为eclipse上没有tomcat8.5.0的配置  所以将其改为8.0.0     在配置web服务器时 ...

  4. ldconfig

    #ldconfig# http://www.cnblogs.com/lyongde/p/4190588.html ldconfig是一个动态链接库管理命令,为了让动态链接库为系统所共享,还需运行动态链 ...

  5. Spring整合struts的配置文件存放问题

    只使用Spring的时候,我把applicationContext.xml是放在项目的src路径下的,这样使用ClassPathXmlApplicationContext很方便嘛 整合了struts之 ...

  6. java中 static,final,transient,volatile关键字的作用

    static 和final static  静态修饰关键字,可以修饰 变量,程序块,类的方法: 当你定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而 ...

  7. dubbo监控工具

    现在企业使用dubbo技术太普遍,所以dubbo的监控工具也应运而生,而且还很稳定,他就是一个web项目, 部署起来非常简单,下载个项目war包(dubbo-admin-2.5.4-SNAPSHOT. ...

  8. 线上服务内存OOM问题定位[转自58沈剑]

    相信大家都有感触,线上服务内存OOM的问题,是最难定位的问题,不过归根结底,最常见的原因: 本身资源不够 申请的太多 资源耗尽 58到家架构部,运维部,58速运技术部联合进行了一次线上服务内存OOM问 ...

  9. 图片加载完毕后执行JS代码

    $("#img").load(function(){...}); 这是jquery提供的一个方法,但是在IE中会有BUG,IE8不支持,IE9以上刷新后也不会执行,只有强制刷新才执 ...

  10. test20180921 手机信号

    题意 分析 我们用形如(l, r, v) 的三元组描述一个区间,这个区间中从l 到r 每隔v 有一个信号站. 考虑一次construct 操作,会添加一个新的区间,并可能将一个已经存在的区间分裂为两个 ...