虽然我可以更改名称并分配不同的属性,但我只是不明白为什么 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”),所以我只想要一个基本的解释,请问为什么不考虑它的唯一性。
HttpGet(Name 属性)和 Route 属性之间存在歧义。
根据 MS Doc:
Name:获取路由名称。路由名称可用于使用特定路由生成链接,而不是依赖于基于给定路由值集的路由选择。
这看起来像是 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()