【问题标题】:Specify API version for all WEB API controllers为所有 WEB API 控制器指定 API 版本
【发布时间】:2019-08-11 16:27:22
【问题描述】:

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

【问题讨论】:

    标签: c# .net asp.net-web-api2 api-versioning


    【解决方案1】:

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

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 谢谢,这看起来就像我目前的设置。但是,我遇到的情况是,一些控件可能在 1.1 版上,而一些仍然在 1.0 版上。并且客户端仍将发送版本 1.1 。到目前为止,我发现的解决方案是用两个版本装饰所有控件,但这似乎是半最佳的。希望我可以在基类上设置所有属性,但我认为这行不通
    【解决方案2】:

    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)));

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 2014-10-07
      • 2021-06-19
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      • 2017-03-18
      • 1970-01-01
      • 2014-07-08
      • 1970-01-01
      相关资源
      最近更新 更多