【问题标题】:Microsoft.AspNetCore.Mvc.Versioning how to default to the "latest" versionMicrosoft.AspNetCore.Mvc.Versioning 如何默认为“最新”版本
【发布时间】:2019-03-10 23:37:44
【问题描述】:

除了在构建新版本时更改 startup.cs,

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

有没有办法指定“默认版本”是最新版本,而不指定那个版本是什么?例如某种说法

config.DefaultApiVersion = new ApiVersionLatest();

。 . .或者这是否违背了所有被 RESTApi 诸神视为神圣的事物?

谢谢

【问题讨论】:

  • 哈!访问我的ConfigureServices 并看到我忘记将DefaultApiVersion 轻推到下一个版本,这对我来说是一个有趣的问题。我可能只是在Controller classes/actions 上搜索带有ApiVersionAttribute 反射的程序集并选择最高的,但也许有一种不那么蛮力的方法。可能是IActionDescriptorCollectionProvider,但我们还没有服务提供商可以从中获取。嗯……
  • @spender:这看起来像是答案,为什么要把它放在评论中?
  • 因为我很忙,我想让你先尝试一下,然后报告!

标签: c# .net-core api-versioning


【解决方案1】:

正确的答案在一定程度上取决于您期望达到的目标。 DefaultApiVersion 只有在没有其他 API 版本可用时才会发挥作用。 API 版本控制“无 API 版本”的概念。 API version-neutral 表示 API 接受任何和所有 API 版本,包括根本不接受。 default API 版本也可以被认为是 initial API 版本。

以下是DefaultAPiVersion 发挥作用的几个场景:

  • 控制器未应用任何属性或约定
  • 选择可能的 API 版本不会产生任何结果

听起来您好像有兴趣在一个地方配置最新的 API 版本。您可以使用DefaultApiVersion 来执行此操作,但前提是控制器没有其他属性或约定。如果 API 不继承,您将必须使用指示旧 API 版本的属性或约定显式装饰控制器,以将其从 最新 版本中排除。虽然这是可能的,但很难遵循 IMO。

更好的方法可能是使用描述您想要的行为的扩展。例如:

[AttributeUsage( AttributeTargets.Class, AllowMultiple = false )]
public sealed class LatestApiVersionAttribute : ApiVersionAttribute, IApiVersionProvider
{
  public LatestApiVersionAttribute() : base( new ApiVersion( 2, 0 ) ) { }
}

现在您可以将它应用到所有控制器上:

[LatestApiVersion]
public class MyController : ControllerBase
{
  // ommitted
}

这让您有机会在一个地方管理最新的 API 版本。您也可以考虑使用约定,这样您甚至不需要自定义属性。属性和约定可以组合。

@spender 确实提到了使用自定义 IApiVersionSelector;但是,当前选择仅在未指定 API 版本时才起作用。要启用这种类型的配置,请将其设置为:

services.AddApiVersioning( options =>
{
   options.ApiVersionSelector = new CurrentImplementationApiVersionSelector( options );
   options.AssumeDefaultVersionWhenUnspecified = true;
}

这将使未指定 API 版本的客户端始终转发到所请求 API 的最新版本。客户仍然可以明确要求特定版本,包括最新版本。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 2023-02-25
    • 1970-01-01
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多