.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
相关产品推荐
相关产品推荐

