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

.Net Web API如何在GET/POST请求的Swagger文档中隐藏指定字段

.NET Web API 全场景隐藏Swagger模型属性方案(兼容POST请求体/GET查询字符串)

之前常用的[JsonIgnore]、[Obsolete]、普通自定义特性方案仅对POST Body的JSON序列化流程生效,GET请求的Query参数是Swagger直接读取模型绑定元数据生成的,不经过JSON序列化环节,所以会出现POST下隐藏了、GET下还显示的问题。
按以下步骤实现即可覆盖两种场景,且不影响接口实际参数绑定逻辑:

  • 第一步:定义专用的Swagger隐藏标记特性
[AttributeUsage(AttributeTargets.Property, AllowMultiple = false)]
public class SwaggerIgnoreAttribute : Attribute { }
  • 第二步:实现两个Swagger过滤器,分别处理Query参数场景和Body模型场景
// 处理GET请求平铺的Query参数
public class IgnorePropertyOperationFilter : IOperationFilter
{
    public void Apply(OpenApiOperation operation, OperationFilterContext context)
    {
        if (operation.Parameters == null || !operation.Parameters.Any()) return;
        
        // 扫描所有入参模型中标记了SwaggerIgnore的属性名
        var ignorePropNames = context.ApiDescription.ActionDescriptor.Parameters
            .SelectMany(p => p.ParameterType.GetProperties())
            .Where(prop => prop.IsDefined(typeof(SwaggerIgnoreAttribute), false))
            .Select(prop => prop.Name)
            .ToHashSet(StringComparer.OrdinalIgnoreCase);
        
        // 从参数列表中移除需要隐藏的项
        operation.Parameters = operation.Parameters
            .Where(p => !ignorePropNames.Contains(p.Name))
            .ToList();
    }
}

// 处理POST请求的Body模型结构
public class IgnorePropertySchemaFilter : ISchemaFilter
{
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (schema.Properties == null || !schema.Properties.Any()) return;
        
        var ignorePropNames = context.Type.GetProperties()
            .Where(prop => prop.IsDefined(typeof(SwaggerIgnoreAttribute), false))
            .Select(prop => prop.Name)
            .ToHashSet(StringComparer.OrdinalIgnoreCase);
        
        foreach (var propName in ignorePropNames)
        {
            schema.Properties.Remove(propName);
        }
    }
}
  • 第三步:在Swagger配置中注册两个过滤器
builder.Services.AddSwaggerGen(opt =>
{
    // 其余Swagger配置保持不变
    opt.OperationFilter<IgnorePropertyOperationFilter>();
    opt.SchemaFilter<IgnorePropertySchemaFilter>();
});
  • 第四步:给需要隐藏的Skip字段加上标记即可
public class QueryRequestModel
{
    // 其余业务字段...
    [SwaggerIgnore]
    public int Skip { get; set; }
}

注意:该方案仅修改Swagger文档的生成逻辑,不会改变接口的参数绑定行为,和[JsonIgnore]会阻断参数接收的逻辑有本质区别,上线前可以分别调用GET、POST接口验证参数接收正常,同时Swagger UI中已无Skip字段展示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:54:22