1

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

4

2 回答 2

4

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

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

  1. 创建您自己的属性,扩展ApiVersionsBaseAttribute,允许它被继承并将其应用于基类。
  2. 创建您自己的属性,实现IApiVersionProvider,允许它被继承,并将其应用于基类。
  3. 枚举配置设置中的所有控制器类型,并使用将一个或多个 API 版本应用于所有控制器的约定。options.Conventions.Controller(controllerType).HasApiVersion(1.0);. 这将与显式属性联合(例如:1.1)
  4. 您可以编写自定义约定,将一个或多个 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 回答