zoukankan      html  css  js  c++  java
  • 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.

    下面将继续讲解剖析HttpServer。

  • 相关阅读:
    超值干货:微服务架构下如何解耦,对于已经紧耦合下如何重构?
    程序员收藏不看系列:近三万字总结Spring注解开发!
    干货收藏:6 款能挣钱的 Spring Boot 开源后台管理系统
    美团二面:你向 Mysql 数据库插入 100w 条数据用了多久?
    5分钟快速掌握阿里内部MySQL性能优化的核心技术!
    优秀!一鼓作气学会“一致性哈希”,就靠这 18 张图了
    分库分表神器 Sharding-JDBC,几千万的数据你不搞一下?
    熬夜肝出5大点,18张图带你彻底弄懂MySQL事务日志
    jdk8新特性Stream
    java多线程
  • 原文地址:https://www.cnblogs.com/DripRoad/p/6160807.html
Copyright © 2011-2022 走看看