我在 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 动词。
[apiController, Route("api/[controller]")]
从那里删除操作对象并使用 HttpGet
方法添加,如 [HttpGet("index")]
并为每个 HTTP 请求使用唯一的名称