WebApi2官网学习记录---Configuring

时间:2021-08-12 14:50:18

Configuration Settings

WebAPI中的configuration settings定义在HttpConfiguration中。有一下成员:

  • DependencyResolver
  • Filters
  • Formatters
  • IncludeErrorDetailPolicy
  • Initializer
  • MessageHandlers
  • ParameterBindingRules
  • Properties
  • Routes
  • Services

在ASP.NET Hosting中配置WebApi

namespace WebApplication1
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// TODO: Add any additional configuration code. // Web API routes
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}

OWIN Self-Hosting中配置WebAPI

使用OWIN进行self-Hosting,需要创建一个HttpConfiguration实例,在这个实例中添加一些配置,然后将这个实例传给Owin.UseWebApi的扩展方法。

public class Startup

{

public void Configuration(IAppBuilder appBuilder)

{

HttpConfiguration config = new HttpConfiguration();

        config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
); appBuilder.UseWebApi(config);
}
}

Global Web API Services

HttpConfiguration.Services包含一些列的global services,WebAPI使用这些services执行各种各样的tasks,例如controller的选择以及content negotiation。

Services集合会被默认定义的services初始化,但是可以进行定义实现,一些services支持多个实例,一些仅支持一个实例。

支持单个实例的services

IActionValueBinder、IApiExplorer、IAssembliesResolver、IBodyModelValidator、IContentNegotiator、IDocumentationProvider、IHostBufferPolicySelector、IHttpActionInvoker、IHttpActionSelector、IHttpControllerActivator、IHttpControllerSelector、IHttpControllerTypeResolver、ITraceManager、ITraceWriter、IModelValidatorCache

支持多实例的services

IFilterProvider、ModelBinderProvider、ModelMetadataProvider、ModelValidatorProvider、ValueProviderFactory

将自定义的实现添加到支持多实例的service,可以使用Add和Insert的方式

config.Services.Add(typeof(IFilterProvider), new MyFilterProvider());
config.Services.Insert(typeof(IFilterProvider),0,new MyFilterProvider());

使用自定义的实现替换仅支持单实例的service

config.Services.Replace(typeof(ITraceWriter), new MyTraceWriter());

Per-Controller Configuration

使用per-controller方式可以重写如下设置:

  • Media-type formatters

  • Parameter binding rules

  • Services

    通过自定义实现IControllerConfiguration接口的特性,然后应用到controller上可以实现上述目标

    using System;

    using System.Web.Http;

    using System.Web.Http.Controllers;

    namespace WebApplication1.Controllers

    {

      public class UseMyFormatterAttribute : Attribute, IControllerConfiguration
    {
    public void Initialize(HttpControllerSettings settings,
    HttpControllerDescriptor descriptor)
    {
    // Clear the formatters list.
    settings.Formatters.Clear(); // Add a custom media-type formatter.
    settings.Formatters.Add(new MyFormatter());
    }
    } [UseMyFormatter]
    public class ValuesController : ApiController
    {
    // Controller methods not shown...
    }

    }

IControllerConfiguration接口的作用:如果某个控制器是使用此接口的特性修饰的,则将调用此接口来初始化该控制器设置。

IControllerConfiguration.Initialize方法包含两个参数:

  • HttpControllerSettings 这个对象是Configuration的一个子集,包含可以在per-controller时被重写的的对象
  • HttpControllerDescriptor 包含controller的描述信息