如何隐藏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
相关产品推荐
相关产品推荐

