.NET 5使用Swashbuckle时如何移除Swagger中空的旧控制器分组
问题原因
Swashbuckle.AspNetCore 默认会以控制器名称(移除Controller后缀后的字符串)作为默认Tag生成对应分组。即使你已经在单个接口上通过[SwaggerOperation]指定了自定义Tags,框架仍会为原控制器生成一个独立Tag,最终出现没有挂载任何接口的空分组。
解决方案
根据你的业务场景二选一即可:
方案一:控制器级别统一指定分组(推荐,适合同一控制器下所有接口归属同一分组的场景)
直接在控制器类上添加[SwaggerTag]特性标记所属分组,移除接口上重复的Tags配置即可,框架不会再生成默认的控制器名空分组。
修改后的控制器代码如下:
[Route("v1/taggroups")] [ApiController] [SwaggerTag("TagGroups")] public class ProfileGroupTypesController : ControllerBase { [HttpPost] [SwaggerOperation(OperationId = "Add Tag Group")] public IActionResult CreateProfileGroupType([FromBody] CreateProfileGroupTypeRequest request) { // 业务逻辑代码 } }
方案二:自定义Tag生成规则(适合同一控制器下接口需要拆分到多个分组的场景)
如果同一个控制器下的接口需要归属到不同Tag,无法在控制器级别统一配置,可以修改Swagger生成配置,替换默认的Tag选择逻辑,优先读取接口上标注的自定义Tags,避免生成冗余空分组。
修改Startup中的Swagger配置代码如下:
public void ConfigureServices(IServiceCollection services) { // 其他省略的服务配置 services.AddSwaggerGenNewtonsoftSupport(); services.AddSwaggerGen(x => { x.EnableAnnotations(); // 自定义Tag选择逻辑 x.TagActionsBy(apiDesc => { // 优先读取接口上SwaggerOperation配置的Tags var operationAttr = apiDesc.ActionDescriptor.EndpointMetadata .OfType<SwaggerOperationAttribute>() .FirstOrDefault(); if (operationAttr?.Tags != null && operationAttr.Tags.Any()) { return operationAttr.Tags; } // 未自定义配置时才回退使用控制器名作为Tag return new[] { apiDesc.ActionDescriptor.RouteValues["controller"] }; }); }); }
配置完成后重新编译启动项目,冗余的空控制器名分组就会被移除,所有接口只会归属到你自定义的TagGroups分组下。
排错提示:如果配置后仍存在空分组,检查控制器内是否有未配置Tags的接口,或是文档过滤配置误将部分接口排除,导致对应分组下没有可展示的接口。
内容的提问来源于stack exchange,提问作者David Klempfner
相关产品推荐
相关产品推荐

