SwashBuckle/Swagger 隐藏了我的不可变属性

roc*_*m4l 5 c# swagger swashbuckle

对于通过[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
    },
  }
}
Run Code Online (Sandbox Code Playgroud)

roc*_*m4l 8

所以我找到了一个解决方案。我创建了一个 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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)