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 的默认路由?
我也在尝试实现相同的功能。通过研究[ https://github.com/Microsoft/aspnet-api-versioning/issues/351#issuecomment-425106940]
,我假设我们无法AssumeDefaultVersionWhenUnspecified仅使用单一版本控制风格来实现默认的API版本功能URL段[Route("api/v{version:apiVersion}/[controller]")]
我们必须分别定义两条路线,如下
[Route("api/[controller]")][Route("api/v{version:apiVersion}/[controller]")]并隐藏这两个实现,您可以使用此链接来实现
总结 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)
| 归档时间: |
|
| 查看次数: |
2321 次 |
| 最近记录: |