Microsoft.AspNetCore.Mvc.Versioning如何默认为“最新”版本

时间:2018-10-05 12:47:22

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

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

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

是否有一种方法可以指定“默认版本”为最新版本,而无需指定该版本是什么?例如一些表达方式

config.DefaultApiVersion = new ApiVersionLatest();

。 。 。还是面对RESTApi神所认为的圣洁之物?

谢谢

1 个答案:

答案 0 :(得分:0)

正确的答案 取决于您期望达到的目标。 DefaultApiVersion仅在没有其他API版本可用时起作用。 API版本控制具有“无API版本” 的概念。 API version-neutral 表示API接受任何API版本和所有API版本,包括根本不接受任何版本。 default API版本也可以被视为 initial API版本。

以下是DefaultAPiVersion发挥作用的几种情况:

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

听起来很像,就像您有兴趣在一个地方配置最新的API版本一样。您可以 使用DefaultApiVersion来执行此操作,但前提是控制器没有其他属性或约定。如果API无法继续使用,则您必须使用表示旧版API版本的属性或约定来显式装饰控制器,以将其从 latest 版本中排除。尽管这是可能的,但很难遵循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版本。您可能还会考虑使用约定,因此甚至不需要custom属性。属性和约定可以组合。

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

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

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

我希望有帮助。