ASP.NET Core 中的 url 版本控制 - 多个匹配端点的问题

问题描述 投票:0回答:1

我正在制作我的 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:请求匹配多个端点。知道为什么会这样吗?

我尝试了几种属性组合来测试我是否理解错误,但它没有起作用。

c# asp.net versioning
1个回答
0
投票

我建议您将版本

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

© www.soinside.com 2019 - 2024. All rights reserved.