为所有 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,这是不明确的并且会产生错误。
有几种可能的方法可以实现您的目标:
- 创建您自己的属性,扩展 ApiVersionsBaseAttribute,允许它被继承并将其应用到基础 class.
- 创建你自己的属性,实现IApiVersionProvider,允许它被继承,并应用到一个基础class.
- 枚举配置设置中的所有控制器类型,并使用将一个或多个 API 版本应用于所有控制器的 约定 。
options.Conventions.Controller(controllerType).HasApiVersion(1.0);
。这将与显式属性联合(例如:1.1)
- 您可以编写自定义 约定 ,将一个或多个 API 版本应用于所有或特定控制器。目前,约定只能应用于整个控制器,但在下一个主要版本中将提供对每个动作的支持(因为 API 有重大变化,尽管大多数没有明显的变化) .例如,
options.Conventions.Add(new MyConvention(new ApiVersion(1,0)));
.
希望对您有所帮助。
我正在使用 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,这是不明确的并且会产生错误。
有几种可能的方法可以实现您的目标:
- 创建您自己的属性,扩展 ApiVersionsBaseAttribute,允许它被继承并将其应用到基础 class.
- 创建你自己的属性,实现IApiVersionProvider,允许它被继承,并应用到一个基础class.
- 枚举配置设置中的所有控制器类型,并使用将一个或多个 API 版本应用于所有控制器的 约定 。
options.Conventions.Controller(controllerType).HasApiVersion(1.0);
。这将与显式属性联合(例如:1.1) - 您可以编写自定义 约定 ,将一个或多个 API 版本应用于所有或特定控制器。目前,约定只能应用于整个控制器,但在下一个主要版本中将提供对每个动作的支持(因为 API 有重大变化,尽管大多数没有明显的变化) .例如,
options.Conventions.Add(new MyConvention(new ApiVersion(1,0)));
.
希望对您有所帮助。