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

时间:2022-05-28 03:58:47

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

路由表(Routes)

过滤器(Filters)

默认消息处理程序(MessageHandlers)

属性字典(Properties)

依赖注入解耦器(DependencyResolver)

错误处理策略(IncludeErrorDetailPolicy)

服务(Services,这里的服务是之为Web ApI 框架的服务对应的接口和实现)

媒体格式程序(Formatters)

参数绑定规则(ParameterBindingRules)。

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

Formatters

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

API 里定义4个默认格式:

JsonMediaTypeFormatter:对应的是用来处理请求头是application/json或text/json格式,

XmlMediaTypeFormatter:对应的是用来处理请求头是application/xml格式

FormUrlEncodedMediaTypeFormatter:对应的是用来处理请求头是application/x-www-form-urlencoded,

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());