隐藏模型属性,避免在Swagger中记录

时间:2019-07-23 19:57:12

标签: c# asp.net swagger core swashbuckle

我有一些属性,这些属性我不想在swagger UI中公开,但是如果将它们传递给控制器​​,则仍然允许对它们进行反序列化。 Json ignore无法正常工作,因为它仍然显得张扬,并且不允许对该属性进行序列化和反序列化。

我创建了一个exclude属性,并将其应用于该属性,创建了一个模式过滤器,并将其添加到启动项中。但是该属性仍然显得张扬。

[AttributeUsage(AttributeTargets.Property)]
public class SwaggerExcludeAttribute : Attribute
{
}

已添加到媒体资源

 [SwaggerExcludeAttribute]
 public int? ContentType { get; set; }

过滤器:

 public class SwaggerExcludeSchemaFilter : ISchemaFilter
 {
    public void Apply(OpenApiSchema schema, SchemaFilterContext context)
    {
        if (schema?.Properties.Count == 0)
        {
            return;
        }
        const BindingFlags bindingFlags = BindingFlags.Public |
                                     BindingFlags.NonPublic |
                                     BindingFlags.Instance;

        var memberList = context.Type
                       .GetFields(bindingFlags).Cast<MemberInfo>()
                       .Concat(context.Type
                       .GetProperties(bindingFlags));
        var excludedList = memberList.Where(m =>
                                       m.GetCustomAttribute<SwaggerExcludeAttribute>()
                                       != null)
                                 .Select(m =>
                                     (m.GetCustomAttribute<JsonPropertyAttribute>()
                                      ?.PropertyName
                                      ?? m.Name.ToCamelCase()));

        foreach (var excludedName in excludedList)
        {
            if (schema.Properties.ContainsKey(excludedName))
                schema.Properties.Remove(excludedName);
        }
        var excludedProperties = context.Type.GetProperties().Where(
            t => t.GetCustomAttribute<SwaggerExcludeAttribute>() != null);

        foreach (var excludedProperty in excludedProperties)
        {
            var propertyToRemove =
                schema.Properties.Keys.SingleOrDefault(
                    x => x.ToLower() == excludedProperty.Name.ToLower());

            if (propertyToRemove != null)
            {
                schema.Properties.Remove(propertyToRemove);
            }
        }
    }

}

在启动中:

services.AddSwaggerGen(c => { c.SchemaFilter<SwaggerExcludeSchemaFilter>(); });

内容类型仍然出现在招摇的文档中。有人有其他建议或方法来实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

使用最新版本:5.4.1

pValues[k] = statsmodels.stats.anova_lm(data=y)."Pr(>F)"[1]

答案 1 :(得分:0)

问题似乎在这里

m.Name.ToCamelCase()

因为所有属性均为小写

 m.Name.ToLower()

在调试模式下可以看到它