Swagger提示‘Failed to load API definition’的原因排查(含代码示例)
问题原因
你遇到的Swagger加载失败,核心原因是两个GET接口的路由模板完全重复,ASP.NET Core路由系统无法区分这两个端点,Swagger在生成API定义时检测到路由冲突,因此抛出加载失败的错误。
具体来说,两个接口都标记了[HttpGet("")],最终的路由都是api/Hospitalized,而且都是GET请求。当请求这个路由时,框架无法判断应该调用哪个方法,Swagger也无法生成清晰的API文档,导致报错。
解决方法
可以通过以下几种方式修复这个问题:
方法1:给不同接口设置差异化路由模板
给其中一个接口添加独特的路由片段,让两个接口的路由地址区分开:
[Route("api/[controller]")] [ApiController] public class HospitalizedController : ControllerBase { // 路由:api/Hospitalized [HttpGet("")] public string Get(string MedicID) { // 原有逻辑 } // 路由:api/Hospitalized/with-patient [HttpGet("with-patient")] public string GetWithPatient(string MedicID, string PatientID) { // 原有逻辑 } }
方法2:将PatientID设为可选参数,合并成一个方法
如果两个接口的逻辑可以合并,把PatientID设为可选参数,这样只用一个路由就能处理两种场景:
[Route("api/[controller]")] [ApiController] public class HospitalizedController : ControllerBase { [HttpGet("")] public string Get(string MedicID, string PatientID = null) { string connString = gsUtils.GetDbConnectionString(); if (PatientID == null) { // 仅MedicID的逻辑 } else { // 同时有MedicID和PatientID的逻辑 } } }
方法3:使用路径参数区分路由
如果参数适合作为路径的一部分,可以将参数嵌入路由模板:
[Route("api/[controller]")] [ApiController] public class HospitalizedController : ControllerBase { // 路由:api/Hospitalized/{MedicID} [HttpGet("{MedicID}")] public string Get(string MedicID) { // 原有逻辑 } // 路由:api/Hospitalized/{MedicID}/{PatientID} [HttpGet("{MedicID}/{PatientID}")] public string Get(string MedicID, string PatientID) { // 原有逻辑 } }
内容的提问来源于stack exchange,提问作者stighy
相关产品推荐
相关产品推荐

