2

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

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

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

config.DefaultApiVersion = new ApiVersionLatest();

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

谢谢

4

1 回答 1

1

正确答案取决于您期望达到的目标。只有在DefaultApiVersion没有其他 API 版本可用时才会发挥作用。API 版本控制没有无 API 版本”的概念。API版本中立意味着 API 接受任何和所有 API 版本,包括根本不接受。默认API 版本也可以被认为是初始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 的最新版本。客户仍然可以明确要求特定版本,包括最新版本。

我希望这会有所帮助。

于 2018-10-25T21:26:27.637 回答