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

如何配置Swashbuckle仅识别带有ApiControllerAttribute的控制器?

让Swashbuckle仅识别带ApiController特性的控制器

嘿,这个需求我之前做项目时也碰到过,Swashbuckle默认扫描所有控制器确实有点冗余,不过它提供了很灵活的过滤机制,下面给你分享两种最实用的实现方式:

方法一:使用IApiDescriptionFilter(推荐,性能更优)

这种方式会在Swashbuckle生成API描述的阶段就过滤掉不符合要求的控制器,比生成文档后再移除要高效得多。

首先创建一个自定义过滤器类:

using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.SwaggerGen;

public class ApiControllerOnlyFilter : IApiDescriptionFilter
{
    public bool Apply(ApiDescription apiDescription, SchemaRepository schemaRepository)
    {
        // 尝试获取当前操作对应的控制器描述器
        var controllerActionDescriptor = apiDescription.ActionDescriptor as ControllerActionDescriptor;
        if (controllerActionDescriptor == null) return false;

        // 检查控制器是否带有ApiController特性
        return controllerActionDescriptor.ControllerTypeInfo
            .GetCustomAttributes(typeof(ApiControllerAttribute), inherit: true)
            .Any();
    }
}

然后在Swagger服务配置中注册这个过滤器:

builder.Services.AddSwaggerGen(c =>
{
    // 添加自定义过滤器
    c.ApiDescriptionFilter<ApiControllerOnlyFilter>();
    
    // 你的其他Swagger配置(比如文档信息、安全方案等)
});

方法二:使用IDocumentFilter

如果因为版本原因无法使用IApiDescriptionFilter(比如旧版Swashbuckle),可以用这种方式在文档生成完成后,移除不属于ApiController的路径:

创建文档过滤器类:

using Microsoft.AspNetCore.Mvc;
using Swashbuckle.AspNetCore.SwaggerGen;

public class ApiControllerOnlyDocumentFilter : IDocumentFilter
{
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        // 遍历所有路径,逐一检查对应的控制器是否符合要求
        foreach (var pathEntry in swaggerDoc.Paths.ToList())
        {
            // 获取当前路径对应的API描述
            var apiDescription = context.ApiDescriptions
                .FirstOrDefault(desc => desc.Id == pathEntry.Value.Operations.Values.First()?.OperationId);
            if (apiDescription == null)
            {
                swaggerDoc.Paths.Remove(pathEntry.Key);
                continue;
            }

            var controllerActionDescriptor = apiDescription.ActionDescriptor as ControllerActionDescriptor;
            if (controllerActionDescriptor?.ControllerTypeInfo
                .GetCustomAttributes(typeof(ApiControllerAttribute), true)
                .Any() != true)
            {
                swaggerDoc.Paths.Remove(pathEntry.Key);
            }
        }
    }
}

注册方式类似:

builder.Services.AddSwaggerGen(c =>
{
    c.DocumentFilter<ApiControllerOnlyDocumentFilter>();
    // 其他配置...
});

额外提示

如果你的API控制器还有其他统一特征(比如都在某个命名空间下),可以在过滤器里结合这些条件一起判断,进一步缩小范围,但直接检查ApiController特性是最精准的方式,毕竟这是官方标记API控制器的标准方式。

内容的提问来源于stack exchange,提问作者Haytam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:50:33