我正在使用 Web API .NET 2 构建一个 API,创建了一个所有其他控制器都继承的 BaseController 类。我想使用 [ApiVersion()] 属性应用 API 版本控制,但是如果我有多个版本的 API,我不想用相同的属性装饰每个控制器类。有没有办法为所有控制器设置所有可能的 API 版本?我试图在 BaseController 类上设置属性,但不幸的是,派生类没有继承属性。
问问题
768 次
2 回答
4
ApiVersionAttribute故意不被继承,因为如果您在控制器上使用继承,例如V2.Controllers.ValuesController
从继承V1.Controllers.ValuesController
,您最终会得到两个具有相同路由的控制器,它们都实现 1.0,这是不明确的并且会产生错误。
有几种可能的方法可以实现您的目标:
- 创建您自己的属性,扩展ApiVersionsBaseAttribute,允许它被继承并将其应用于基类。
- 创建您自己的属性,实现IApiVersionProvider,允许它被继承,并将其应用于基类。
- 枚举配置设置中的所有控制器类型,并使用将一个或多个 API 版本应用于所有控制器的约定。
options.Conventions.Controller(controllerType).HasApiVersion(1.0);
. 这将与显式属性联合(例如:1.1) - 您可以编写自定义约定,将一个或多个 API 版本应用于所有或特定控制器。目前,该约定只能应用于整个控制器,但在下一个主要版本中将提供对每个操作的支持(因为 API 有重大更改,尽管大多数情况下没有可见的更改)。例如,
options.Conventions.Add(new MyConvention(new ApiVersion(1,0)));
。
我希望这会有所帮助。
于 2019-04-25T18:11:36.170 回答
4
您可以使用 ApiVersioning 中间件,如下例所示
services.AddApiVersioning(
o =>
{
o.AssumeDefaultVersionWhenUnspecified = true );
o.DefaultApiVersion = new ApiVersion( 1,0);
} );
它将所有控制器的默认版本设置为 1.0。此外,如果未指定版本,则调用将被路由到具有默认版本的控制器。
如果要创建现有控制器的新版本,则可以在该控制器上指定版本属性。
希望这可以帮助。
于 2019-03-20T20:54:40.463 回答