You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 06:54:32