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

如何隐藏Swagger自动生成的API路由?

如何隐藏Swagger自动生成的API路由?

我太懂这种被一堆无关路由占满Swagger文档的烦躁了!别担心,这几个方法应该能帮你快速清理掉那些自动生成的控制器,只留下你自己写的API:

  • 给自定义控制器打标记,只包含标记过的路由
    你可以给所有自己编写的控制器加上[ApiExplorerSettings(GroupName = "MyOwnAPIs")]特性,然后在配置Swagger的代码里,指定只生成这个分组的文档。比如在Program.cs(如果是老版本.NET就看Startup.cs)里这么写:

    builder.Services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "My Custom APIs", Version = "v1" });
        // 只筛选出自定义分组的API
        c.DocInclusionPredicate((docName, apiDesc) =>
        {
            if (docName != "v1") return false;
            var groupName = apiDesc.ActionDescriptor.EndpointMetadata
                .OfType<ApiExplorerSettingsAttribute>()
                .FirstOrDefault()?.GroupName;
            return groupName == "MyOwnAPIs";
        });
    });
    

    这样一来,那些自动生成的控制器因为没加这个标记,就会被Swagger自动排除,文档里只会显示你标记过的路由。

  • 根据命名规则直接过滤自动生成的控制器
    既然你发现那些自动生成的控制器都有固定命名规律(比如带-controller、-entity-controller后缀),可以直接在Swagger配置里写个筛选逻辑,把这些控制器对应的路由去掉:

    builder.Services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "My APIs", Version = "v1" });
        c.DocInclusionPredicate((docName, apiDesc) =>
        {
            var controllerName = apiDesc.ActionDescriptor.RouteValues["Controller"];
            // 匹配自动生成控制器的命名格式,直接排除
            if (controllerName?.EndsWith("-controller", StringComparison.OrdinalIgnoreCase) == true ||
                controllerName?.EndsWith("-entity-controller", StringComparison.OrdinalIgnoreCase) == true ||
                controllerName?.EndsWith("-search-controller", StringComparison.OrdinalIgnoreCase) == true)
            {
                return false;
            }
            return true;
        });
    });
    

    这个方法不用给每个自定义控制器加标记,直接靠命名规则过滤,上手更快。

  • 用自定义DocumentFilter做全局过滤
    如果你需要更灵活的过滤逻辑(比如结合其他条件判断),可以写一个自定义的过滤器,在Swagger生成文档时主动移除不需要的路径:

    public class RemoveAutoGeneratedControllersFilter : IDocumentFilter
    {
        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            var pathsToRemove = new List<string>();
            foreach (var path in swaggerDoc.Paths)
            {
                var apiDesc = context.ApiDescriptions.FirstOrDefault(ad => ad.RelativePath == path.Key.TrimStart('/'));
                if (apiDesc != null)
                {
                    var controllerName = apiDesc.ActionDescriptor.RouteValues["Controller"];
                    if (controllerName != null && 
                        (controllerName.Contains("-controller") || controllerName.Contains("-entity-controller") || controllerName.Contains("-search-controller")))
                    {
                        pathsToRemove.Add(path.Key);
                    }
                }
            }
            foreach (var path in pathsToRemove)
            {
                swaggerDoc.Paths.Remove(path);
            }
        }
    }
    

    然后在Swagger配置里注册这个过滤器:

    builder.Services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "My APIs", Version = "v1" });
        c.DocumentFilter<RemoveAutoGeneratedControllersFilter>();
    });
    

    这种方式适合复杂场景,能根据你自己的需求调整过滤规则。

你可以根据自己的项目情况选其中一种方法,一般前两种就足够解决问题了,试一下应该就能把那些乱七八糟的自动生成控制器从Swagger文档里清掉啦!

备注:内容来源于stack exchange,提问作者Gwendal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 16:44:26