在控制器上使用默认操作时,Swagger 会抛出冲突的方法/路径组合

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

我在 ASP.NET (Core) 8.0 上使用 Swagger 来记录我的 API 路由。

我使用的典型模板是一个控制器,其路由定义为如下属性:

[ApiController, Route("api/[controller]/{action=Index}")]

public class ConfigurationController(IConfigurationService _config) : Controller
{
    [HttpGet]
    public async Task<IActionResult> Index(string key)
    {
       return Ok(await _config.GetSettingOrDefault(key));
    }
}

这样我就可以使用像

/api/configuration?key=bookingPref
这样的路线进行 GET。

然而,当我尝试获取 Swagger JSON 文件时,出现以下异常:

SwaggerGeneratorException:操作的冲突方法/路径组合“GET api/configuration/{action}” - Rhb.Platform.Controllers.API.ConfigurationController.Index (Rhb.Platform)、Rhb.Platform.Controllers.API.ConfigurationController.TenancySettings ( Rhb.Platform),Rhb.Platform.Controllers.API.ConfigurationController.DtInfo(Rhb.Platform)。对于 Swagger/OpenAPI 3.0,操作需要独特的方法/路径组合。使用 ConflictingActionsResolver 作为解决方法

在我看来,Swagger 不喜欢路由模板中的默认操作。当我将控制器上的路由属性更改为:

[ApiController, Route("api/[controller]/[action]")]

它有效,我得到了生成的 JSON。我可以放下我的骄傲,只是将索引路由上的 Get 重命名为 GetSetting,但我宁愿将默认操作定义为每个控制器索引上的 GET,以避免在路径中重复 HTTP 动词。

asp.net-core swagger swashbuckle
1个回答
0
投票

[apiController, Route("api/[controller]")]
从那里删除操作对象并使用
HttpGet
方法添加,如
[HttpGet("index")]
并为每个 HTTP 请求使用唯一的名称

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