为所有 WEB API 控制器指定 API 版本

Specify API version for all WEB API controllers

我正在使用 Web API .NET 2 构建一个 API,创建了一个所有其他控制器都继承的 BaseController class。我想使用 [ApiVersion()] 属性应用 API 版本控制,但是如果我有多个 API 版本,我不想用相同的属性装饰每个控制器 class .有没有办法为所有控制器设置所有可能的 API 版本?我尝试在 BaseController class 上设置属性,但不幸的是属性不会被派生的 classes 继承。

您可以使用 ApiVersioning 中间件,如下例所示

services.AddApiVersioning(
    o =>
    {
        o.AssumeDefaultVersionWhenUnspecified = true );
        o.DefaultApiVersion = new ApiVersion( 1,0);
    } );

它将所有控制器的默认版本设置为 1.0。 此外,如果未指定版本,调用将被路由到具有默认版本的控制器。

如果要创建现有控制器的新版本,则可以在该控制器上指定版本属性。

希望对您有所帮助。

ApiVersionAttribute 有意不被继承,因为如果您在控制器上使用继承,例如 V2.Controllers.ValuesController 继承自 V1.Controllers.ValuesController,您最终会得到两个具有相同路由的控制器都实现了 1.0,这是不明确的并且会产生错误。

有几种可能的方法可以实现您的目标:

  1. 创建您自己的属性,扩展 ApiVersionsBaseAttribute,允许它被继承并将其应用到基础 class.
  2. 创建你自己的属性,实现IApiVersionProvider,允许它被继承,并应用到一个基础class.
  3. 枚举配置设置中的所有控制器类型,并使用将一个或多个 API 版本应用于所有控制器的 约定 options.Conventions.Controller(controllerType).HasApiVersion(1.0);。这将与显式属性联合(例如:1.1)
  4. 您可以编写自定义 约定 ,将一个或多个 API 版本应用于所有或特定控制器。目前,约定只能应用于整个控制器,但在下一个主要版本中将提供对每个动作的支持(因为 API 有重大变化,尽管大多数没有明显的变化) .例如,options.Conventions.Add(new MyConvention(new ApiVersion(1,0)));.

希望对您有所帮助。