当名称和路由不同时,为什么这个 API 被认为具有不明确的方法/路径组合?

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

虽然我可以更改名称并分配不同的属性,但我只是不明白为什么 Swagger 认为这两种方法之间的一切都不同(参数除外)是模棱两可的?

SwaggerGeneratorException:不明确的 HTTP 操作方法 - WebApplication5.Controllers.WeatherForecastController.GetWeatherB (WebApplication5)。操作需要 Swagger/OpenAPI 3.0 的显式 HttpMethod 绑定

这是 VS 2022 的示例 api。

  [ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
    "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }
    [HttpGet(Name = "TestB")]
    [Route("/TestRouteB")]
    public IEnumerable<WeatherForecast> GetWeatherB([FromQuery] QueryParameters queryParam)
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }

    [HttpGet(Name = "TestA")]
    [Route("/TestRouteA")]
    public IEnumerable<WeatherForecast> GetWeatherA([FromQuery] QueryParameters queryParam)
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }

这可以通过删除“名称”属性来解决。但我认为 NAME 属性将解决重复的方法名称?在这种情况下,两种方法中 Name 的值是不同的(“TestA”和“TestB”),所以我只想要一个基本的解释,请问为什么不考虑它的唯一性。

c# api asp.net-core asp.net-web-api swagger-ui
2个回答
0
投票

HttpGet(Name 属性)和 Route 属性之间存在歧义。
根据 MS Doc:

https://learn.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.httpgetattribute?view=aspnetcore-7.0

Name:获取路由名称。路由名称可用于使用特定路由生成链接,而不是依赖于基于给定路由值集的路由选择。


0
投票

这看起来像是 Swashbuckle 中的问题/错误,因为没有真正的歧义。
控制器上的两个端点都运行良好。只有 Swashbucle 失败了。 GitHub 上的源代码显示错误被抛出 here.

如果您有冲突的端点/路由,那么在执行其中一个端点时,ASP.NET Core 框架会抛出

AmbiguousMatchException

AmbiguousMatchException: The request matched multiple endpoint

您可以尝试在两种操作方法上使用相同的路由模板。


路由名称不参与确定端点的唯一性。
来自文档

路线名称:

  • 对 URL 匹配或请求处理没有影响。
  • 仅用于 URL 生成。

为了让你解决,保持名称与你设置路由模板的属性相同。
执行以下操作之一。

[HttpGet] 
[Route("/TestRouteA", Name = "TestA")]
public IEnumerable<WeatherForecast> GetWeatherA()

[HttpGet]
[Route("/TestRouteB", Name = "TestB")]
public IEnumerable<WeatherForecast> GetWeatherB()

[HttpGet("/TestRouteA", Name = "TestA")]
public IEnumerable<WeatherForecast> GetWeatherA()

[HttpGet("/TestRouteB", Name = "TestB")]
public IEnumerable<WeatherForecast> GetWeatherB()
© www.soinside.com 2019 - 2024. All rights reserved.