C#生成Swagger时部分API报Failed to fetch问题求助
Api/V1/Promotion/VIP接口报错的问题 根据你描述的现象和代码,我判断这个问题大概率是Chrome客户端拦截器误拦截+控制器方法重载导致Swagger文档歧义的双重因素造成的,下面给出具体的排查和修复步骤:
1. 优先排查Chrome的广告/隐私拦截器
net::ERR_BLOCKED_BY_CLIENT这个错误几乎都是浏览器插件(比如AdBlock、uBlock Origin、隐私Badger这类)拦截了请求导致的。很多拦截规则会自动拦截包含VIP、Premium这类和付费会员相关的关键词的URL,Swagger的请求刚好触发了这个规则。
你可以按以下步骤验证:
- 暂时禁用Chrome里所有的广告拦截/隐私保护插件,然后刷新Swagger页面测试这个接口。
- 如果测试有效,把你的Swagger访问域名(比如
localhost:xxxx或者正式域名)添加到拦截器的白名单中,避免后续再被拦截。
2. 修复控制器的方法重载问题
看你的代码,控制器里有两个同名的Get方法,虽然路由不同(一个是api/v1/Promotion,一个是api/v1/Promotion/VIP),但Swagger的文档生成器对这种同名重载的识别容易出问题,可能导致接口文档生成异常,进一步加剧了Chrome拦截后的报错表现。
另外注意:你的Lambda表达式漏写了箭头,Where(x.IsActive)应该改为Where(x => x.IsActive),这个会导致运行时错误,记得一起修正。
你可以通过以下两种方式修复方法重载问题:
方式一:给方法重命名(推荐)
直接修改第二个Get方法的名称,让它和第一个方法区分开,Swagger就能正确识别两个不同的接口:
[ApiVersion("1.0")] [Route("api/v{version:apiVersion}/Promotion")] public class PromotionV1Controller : Controller { private myDbContext _DbContext; public PromotionV1Controller(myDbContext dbContext) { _DbContext= dbContext; } // GET api/Promotion /// <summary> /// Get list of Promotion /// </summary> [HttpGet] [AllowAnonymous] public IEnumerable<Promotion> GetPromotions() { return _DbContext.Promotions.AsNoTracking().Where(x => x.IsActive); } // GET api/Promotion/VIP /// <summary> /// Get list of VIP Promotion /// </summary> [HttpGet, Route("VIP")] [AllowAnonymous] public IEnumerable<Promotion> GetVIPPromotions() { return _DbContext.Promotions.AsNoTracking().Where(x => x.IsActive && x.Type == AdsType.VIP); } }
方式二:使用[ActionName]属性
如果你不想修改方法名,可以给第二个方法添加[ActionName]属性,明确告诉Swagger它的标识:
// GET api/Promotion/VIP /// <summary> /// Get list of VIP Promotion /// </summary> [HttpGet, Route("VIP")] [AllowAnonymous] [ActionName("GetVIPPromotions")] public IEnumerable<Promotion> Get() { return _DbContext.Promotions.AsNoTracking().Where(x => x.IsActive && x.Type == AdsType.VIP); }
总结
先排查Chrome的拦截器问题,这是导致你看到ERR_BLOCKED_BY_CLIENT的直接原因;再修复控制器方法的重载和Lambda表达式错误,确保Swagger能正确生成接口文档。两个步骤结合起来,应该就能解决这个仅在Chrome Swagger中出现的异常了。
内容的提问来源于stack exchange,提问作者Asakuraa Ranger

