所以我有两个版本的控制器(及其GET操作(,让我们称之为v1
和v2
。
.../Controller/v1/MyController.cs
看起来像
[ApiVersion("1")]
[Route("api/[controller]")]
[Route("api/v{version:apiVersion}/[controller]")]
public class MyController : Controller
{
..
[HttpGet]
public async Task<IActionResult> GetAsync()
{
..
}
}
请注意,此控制器具有[Route("api/[controller]")]
默认属性,以便我可以通过localhost:5000/v1/my
和localhost:5000/my
访问它。
.../Controller/v2/MyController.cs
看起来像
[ApiVersion("2")]
[Route("api/v{version:apiVersion}/[controller]")]
public class MyController : Controller
{
..
[HttpGet]
public async Task<IActionResult> GetAsync()
{
..
}
}
此 API 当前由localhost:5000/v2/my
访问。
现在,我想将 v2 作为默认 API 而不是 v1。
所以我尝试添加[Route("api/[controller]")]
属性,以便我的v2 controller
如下所示:
[ApiVersion("2")]
[Route("api/[controller]")]
[Route("api/v{version:apiVersion}/[controller]")]
public class MyController : Controller
{
..
[HttpGet]
public async Task<IActionResult> GetAsync()
{
..
}
}
现在,当我尝试在 POSTMAN 上运行和执行以下错误时:
{
"Error": {
"Code": "UnsupportedApiVersion",
"Message": "The HTTP resource that matches the request URI 'http://localhost:5000/api/my' does not support the API version '1.0'."
}
}
但是,设置默认路由时适用于 v1 版本。 我不确定为什么是造成这种情况的原因。是因为命名空间吗?控制器类的位置在命名空间中包含 v2。
任何线索都会有所帮助。
在启动文件中,可以设置默认的 API 版本
services.AddApiVersioning(o => {
o.ReportApiVersions = true;
o.AssumeDefaultVersionWhenUnspecified = true;
o.**DefaultApiVersion** = new ApiVersion(2, 0);
});