C#中如何隐藏Swagger类属性且允许POST请求设置属性值?
解决方案
要实现Swagger文档隐藏属性,但POST请求能正常接收该属性值,核心思路是把「Swagger文档生成」和「Json序列化/反序列化」的逻辑分开处理:让Swagger过滤掉目标属性,同时保留Json反序列化对该属性的支持。
方法1:全局Swagger Schema过滤器(批量隐藏)
创建自定义过滤器,在Swagger生成Schema时移除指定属性,实体类无需添加忽略序列化的特性,确保POST请求能正常绑定属性值。
步骤1:编写过滤器类
public class HidePropertyInSwaggerFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { // 替换为你需要隐藏的属性名称 var targetProperty = "SecretProperty"; if (schema.Properties.ContainsKey(targetProperty)) { schema.Properties.Remove(targetProperty); } } }
步骤2:注册过滤器到Swagger
在Program.cs或Startup.cs的Swagger配置中添加该过滤器:
builder.Services.AddSwaggerGen(c => { c.SchemaFilter<HidePropertyInSwaggerFilter>(); // 其他Swagger配置(如文档标题、版本等) });
方法2:特性标记+过滤器(精准隐藏单个属性)
如果需要只隐藏特定类的特定属性,可以自定义特性配合过滤器实现,灵活性更高。
步骤1:自定义隐藏特性
[AttributeUsage(AttributeTargets.Property)] public class HideInSwaggerAttribute : Attribute { }
步骤2:编写特性识别过滤器
public class HidePropertyInSwaggerFilter : ISchemaFilter { public void Apply(OpenApiSchema schema, SchemaFilterContext context) { // 找出所有标记了HideInSwagger特性的属性 var propertiesToHide = context.Type.GetProperties() .Where(p => p.GetCustomAttribute<HideInSwaggerAttribute>() != null) .Select(p => p.Name); foreach (var propName in propertiesToHide) { if (schema.Properties.ContainsKey(propName)) { schema.Properties.Remove(propName); } } } }
步骤3:在实体属性上标记特性
public class UserRequest { public string Username { get; set; } [HideInSwagger] public string InternalToken { get; set; } // 该属性在Swagger中隐藏,POST请求可正常传入值 }
为什么之前的方法失效?
[JsonIgnore]:会让Json序列化/反序列化全程忽略属性,且Swashbuckle的示例过滤器如果引用了包含该属性的对象,会导致属性重新出现在文档中。[IgnoreDataMember]:属于DataContract序列化体系的特性,会直接让属性在序列化和反序列化时被忽略,所以POST请求传入的值无法绑定,最终被置为null。
内容的提问来源于stack exchange,提问作者Meruj Martirosyan
相关产品推荐
相关产品推荐

