SwashBuckle/Swagger 隐藏了我的不可变属性
SwashBuckle/Swagger is hiding my immutable properties
对于通过 [FromBody]
传递到动作中的模型,我喜欢使它们的属性不可变 public int SomeProperty { get; private set; }
。这样我就知道我的处理程序的输入没有被修改。
我遇到的问题是 Swagger 和 Swashbuckle 完全忽略了那些用于呈现参数有效负载示例的字段。我查看了从我们的 API 生成的 swagger 模式,发现所有提到的字段都有 readOnly: true
.
我想知道是否有某种方法可以将 Swashbuckler 或 Swagger 配置为不忽略这些属性。或者也许有一些方法可以使用 SwashBuckle 扩展框架的某些部分将每个定义的只读设置为 false?
编辑:添加来自 swagger.json
的样本
在此示例中,someProperty 被标记为只读。我认为这就是 属性 没有出现在 POST 参数的生成示例中的原因。如果有办法让 swagger gen 不添加任何只读属性,我会接受的。
{
"type": "object",
"properties": {
"someProperty": {
"format": "int32",
"type": "integer",
"readOnly": true
},
}
}
所以我找到了解决办法。我创建了一个 ISchemaFilter 实现,它只是将每个 属性 上的只读设置为 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;
}
}
}
}
对于通过 [FromBody]
传递到动作中的模型,我喜欢使它们的属性不可变 public int SomeProperty { get; private set; }
。这样我就知道我的处理程序的输入没有被修改。
我遇到的问题是 Swagger 和 Swashbuckle 完全忽略了那些用于呈现参数有效负载示例的字段。我查看了从我们的 API 生成的 swagger 模式,发现所有提到的字段都有 readOnly: true
.
我想知道是否有某种方法可以将 Swashbuckler 或 Swagger 配置为不忽略这些属性。或者也许有一些方法可以使用 SwashBuckle 扩展框架的某些部分将每个定义的只读设置为 false?
编辑:添加来自 swagger.json
的样本在此示例中,someProperty 被标记为只读。我认为这就是 属性 没有出现在 POST 参数的生成示例中的原因。如果有办法让 swagger gen 不添加任何只读属性,我会接受的。
{
"type": "object",
"properties": {
"someProperty": {
"format": "int32",
"type": "integer",
"readOnly": true
},
}
}
所以我找到了解决办法。我创建了一个 ISchemaFilter 实现,它只是将每个 属性 上的只读设置为 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;
}
}
}
}