我正在制作我的 API 的 v2。在 v1 中,我在 URL 中有版本,所以它是 api/v1/something。现在我添加第二个版本的 API 并决定使用 Asp.Versioning.Mvc。所以目前我的控制器看起来像这样:
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
[ApiVersion("1.0")]
[ApiVersion("2.0")]
public class SomeController : ControllerBase
{
//ctor
[HttpGet]
[MapToApiVersion("1.0")]
public async Task<ActionResult<SomeResponse?>> GetSomethingV1([FromQuery] string text)
{
...
{
[HttpGet]
[MapToApiVersion("2.0")]
public async Task<ActionResult<SomeResponse?>> GetSomethingV2([FromQuery] string text)
{
...
{
}
也在 Startup.cs 中
services.AddApiVersioning(config =>
{
config.DefaultApiVersion = new ApiVersion(2.0);
config.AssumeDefaultVersionWhenUnspecified = true;
config.ReportApiVersions = true;
});
services.AddMvc();
不幸的是,它一直给我异常 Microsoft.AspNetCore.Routing.Matching.AmbigouslyMatchException:请求匹配多个端点。知道为什么会这样吗?
我尝试了几种属性组合来测试我是否理解错误,但它没有起作用。
我建议您将版本
1.0
和 2.0
拆分为各自的控制器。在同一个控制器中有两个不同的版本是令人困惑的 ASP.NET。
像这样
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
[ApiVersion("1.0")]
public class SomeController : ControllerBase
{
//ctor
[HttpGet]
[MapToApiVersion("1.0")]
public async Task<ActionResult<SomeResponse?>> GetSomethingV1([FromQuery] string text)
{
}
}
还有
[Route("api/v{version:apiVersion}/[controller]")]
[ApiController]
[ApiVersion("2.0")]
public class SomeController : ControllerBase
{
//ctor
[HttpGet]
[MapToApiVersion("2.0")]
public async Task<ActionResult<SomeResponse?>> GetSomethingV2([FromQuery] string text)
{
}
}
通过这种方式,您可以组织各自控制器的版本。如果您不想为单个域创建两个版本,您也可以利用继承。但这变得很棘手,正如这里提到的:https://github.com/dotnet/aspnet-api-versioning/issues/801#issuecomment-1025948364