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

ASP.NET Core 5下如何从swagger.json的schema中忽略类类型属性

解决方法

你遇到的问题是由于之前的SchemaFilter仅移除了父类中标记[SwaggerIgnore]的属性映射,没有主动清理Swagger Schema仓库中已经预生成的第三方类定义,所以冗余的第三方类Schema还是会保留在文档中。

1. 实现完整的SchemaFilter

更新你的SchemaFilter代码,同时完成「移除标记忽略的属性」和「清理对应类型的Schema及关联依赖」两个动作:

public class SwaggerIgnoreFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (schema.Properties == null || !schema.Properties.Any())
            return;

        // 筛选所有标记了[SwaggerIgnore]的属性
        var ignoredProperties = context.Type.GetProperties()
            .Where(prop => prop.IsDefined(typeof(SwaggerIgnoreAttribute), inherit: false));
        
        foreach (var prop in ignoredProperties)
        {
            // 适配Swagger默认的小驼峰属性命名规则,如果你的配置用了其他命名规则这里对应修改
            var camelCasePropName = char.ToLowerInvariant(prop.Name[0]) + prop.Name[1..];
            if (schema.Properties.ContainsKey(camelCasePropName))
            {
                // 移除父类中的属性映射
                schema.Properties.Remove(camelCasePropName);
                // 递归清理该属性类型和其所有内部关联类型的Schema
                RemoveRelatedSchemas(prop.PropertyType, context.SchemaRepository);
            }
        }
    }

    // 递归清理关联类型Schema
    private void RemoveRelatedSchemas(Type type, SchemaRepository schemaRepo)
    {
        // 跳过基础类型
        if (type.IsPrimitive || type == typeof(string) || type == typeof(DateTime) || type == typeof(Guid))
            return;
            
        // 移除当前类型的Schema
        schemaRepo.Schemas.Remove(type.Name);
        schemaRepo.Schemas.Remove(type.FullName);

        // 处理泛型参数
        if (type.IsGenericType)
        {
            foreach (var genericArg in type.GetGenericArguments())
            {
                RemoveRelatedSchemas(genericArg, schemaRepo);
            }
        }

        // 处理类内部的属性类型
        foreach (var prop in type.GetProperties())
        {
            RemoveRelatedSchemas(prop.PropertyType, schemaRepo);
        }
    }
}

2. 注册Filter并加全局忽略规则

在Startup.cs/Program.cs的Swagger配置中注册上述Filter,还可以直接加全局规则屏蔽整个第三方命名空间下的所有类型,双重保险:

services.AddSwaggerGen(options =>
{
    // 注册自定义SchemaFilter
    options.SchemaFilter<SwaggerIgnoreFilter>();

    // 全局屏蔽不需要生成Schema的类型/命名空间
    options.CustomSchemaIds(type =>
    {
        // 直接匹配第三方类的命名空间前缀,一次性屏蔽所有该命名空间下的类
        if (type.Namespace?.StartsWith("第三方库的根命名空间") == true)
        {
            return null;
        }
        // 其他类型正常返回SchemaId
        return type.FullName;
    });
});

修改完成后重新启动项目,标记了[SwaggerIgnore]的类类型属性及其关联的所有第三方类Schema都会被彻底移除。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 02:39:00