首页 > 解决方案 > SwashBuckle/Swagger 隐藏了我的不可变属性

问题描述

对于通过 I 传递给操作的模型,[FromBody]我喜欢让它们的属性不可变public int SomeProperty { get; private set; }。这样我就知道我的处理程序的输入没有被修改。

我遇到的问题是 Swagger 和 Swashbuckle 完全忽略了这些字段以呈现参数有效负载的示例。我查看了从我们的 API 生成的 swagger 模式,发现所有提到的字段都有readOnly: true.

我想知道是否有某种方法可以配置 Swashbuckler 或 Swagger 以不忽略这些属性。或者也许有一些方法可以使用 SwashBuckle 的扩展框架的某些部分将每个定义的 readonly 设置为 false?

编辑:从 swagger.json 添加示例

在此示例中, someProperty 被标记为只读。我认为这就是为什么该属性没有出现在生成的 POST 参数示例中的原因。如果有办法让 swagger gen 不添加任何只读属性,我会很好。

{
  "type": "object",
  "properties": {
    "someProperty": {
      "format": "int32",
      "type": "integer",
      "readOnly": true
    },
  }
}

标签: c#swaggerswashbuckle

解决方案


所以我找到了解决方案。我创建了一个 ISchemaFilter 实现,它只是将每个属性的 readonly 设置为 false。我需要更多地考虑这对下游意味着什么,所以我不确定我是否喜欢这个解决方案。

public class IgnoreReadOnlySchemaFilter : ISchemaFilter
{
    public void Apply(Schema schema, SchemaFilterContext context)
    {
        schema.ReadOnly = false;
        if (schema.Properties != null)
        {
            foreach (var keyValuePair in schema.Properties)
            {
                keyValuePair.Value.ReadOnly = false;
            }
        }
    }
}

推荐阅读