AssumeDefaultVersionWhenUnspecified 未按预期工作

Ath*_*i S 8 routing asp.net-core asp.net-core-webapi asp.net-core-2.0

我一直在为我的 WebAPI 使用 asp net core 版本控制组件。需要您帮助了解 AssumeDefaultVersionWhenUnspecified 是如何工作的。(尝试搜索文档,但找不到)

我的启动看起来像下面

services.AddApiVersioning(o => {
            o.ReportApiVersions = true;
            o.AssumeDefaultVersionWhenUnspecified = true;
            o.DefaultApiVersion = new ApiVersion(2, 0);
            o.ApiVersionReader = new UrlSegmentApiVersionReader();
        });
Run Code Online (Sandbox Code Playgroud)

当路由属性如下所示

[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/values")]
[ApiController]
public class ValuesV2Controller : ControllerBase
{
...
}
Run Code Online (Sandbox Code Playgroud)

上述路由仅在指定 api 版本时才有效。即:http://localhost:55401/api/v2/values 如果我调用像http://localhost:55401/api/values,得到 404 错误

我的问题是... AssumeDefaultVersionWhenUnspecified 是如何工作的。它不会忽略Route中的版本吗?看起来 Route 属性优先于 AssumeDefaultVersionWhenUnspecified。如果我选择 QueryString 或 Header 版本控制,并且当 Route 看起来像

[ApiVersion("2.0")]
[Route("api/values")]
Run Code Online (Sandbox Code Playgroud)

默认路由到达 API

我错过了什么还是我的理解有误?如何使用 url 版本控制实现到最新版本 API 的默认路由?

Nir*_*edi 6

我也在尝试实现相同的功能。通过研究[ https://github.com/Microsoft/aspnet-api-versioning/issues/351#issuecomment-425106940] ,我假设我们无法AssumeDefaultVersionWhenUnspecified仅使用单一版本控制风格来实现默认的API版本功能URL段[Route("api/v{version:apiVersion}/[controller]")]

我们必须分别定义两条路线,如下

  1. [Route("api/[controller]")]
  2. [Route("api/v{version:apiVersion}/[controller]")]

并隐藏这两个实现,您可以使用此链接来实现


cha*_*ier 5

总结 Athi S 链接的 github 问题的解决方案,您需要执行以下操作:

在Startup.cs文件内的ConfigureServices中:

        services.AddApiVersioning(o =>
        {
            o.AssumeDefaultVersionWhenUnspecified = true;
            o.ApiVersionSelector = new CurrentImplementationApiVersionSelector(o);
            //  o.DefaultApiVersion = new ApiVersion(1, 0);
        });
Run Code Online (Sandbox Code Playgroud)

您可以选择将 ApiVersionSelector 设置为 CurrentImplementationApiVersionSelector 的新实例。它的作用是,它自动选择控制器中注册的最高 api 版本。例如,用 [ApiVersion("1.2")] 装饰的控制器优先于 [ApiVersion("1.1")]。

如果您想显式指定默认 api 版本,可以通过将 ApiVersionSelector 保留为 DefaultApiVersionSelector 并将 DefaultApiVersion 设置为您所需的 api 版本来实现。

在你的控制器中:

通过使用给定的 Route 属性装饰控制器来注册所需的路由

[Route("api/[controller]")]
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望 api 在指定和不指定 api 版本号的情况下都可以工作,您可以通过为控制器声明两条路由来实现。

[Route("api/[controller]")]
[Route("api/v{version:apiVersion}/[controller]")]
Run Code Online (Sandbox Code Playgroud)