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

Posted

技术标签:

【中文标题】SwashBuckle/Swagger 隐藏了我的不可变属性【英文标题】:SwashBuckle/Swagger is hiding my immutable properties 【发布时间】:2019-09-28 23:08:21 【问题描述】:

对于通过[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
    ,
  

【问题讨论】:

也许这会有所帮助codemag.com/article/1905041 你能分享你的 swagger.json,或者至少是你现在拥有的和你想得到的相关部分吗? @HelderSepulveda 我添加了一个示例。我想我想要的是相同的结构,但没有只读。 您使用的是哪个版本的 swashbuckle?我看到最新的 Swashbuckle.AspNetCore 他们有涵盖这些情况的单元测试:github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/… 那些测试用例正在测试 swashbuckle 是否与我想要的相反。如果无法关闭该功能,我可能需要以不同的方式处理不变性。 【参考方案1】:

所以我找到了解决方案。我创建了一个 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;
            
        
    

【讨论】:

接受我自己的答案,因为可以通过使用属性并检查它们来增加额外的复杂性。我决定如果我想要只读字段,我将添加一个 SwaggerReadOnly 属性并在此 SchemaFilter 中使用它,以避免将字段的只读属性设置为 false。 谢谢,拯救了我的夜晚。 这适用于大多数情况,但不适用于枚举或类属性(参考属性)。似乎我们需要使用“UseAllOfToExtendReferencedSchemas”,但我还没有找到一个很好的例子来使用它来获得相同的预期只读结果。

以上是关于SwashBuckle/Swagger 隐藏了我的不可变属性的主要内容,如果未能解决你的问题,请参考以下文章

Swashbuckle Swagger 生成一个实际的 guid

在 Visual Studio 2012 中安装包 Swashbuckle/swagger 时出错

csharp Swashbuckle(Swagger)中的默认模型示例

将 WebApi 方法的参数标记为过时/不推荐用于 Swashbuckle / Swagger

csharp 在Swashbuckle Swagger中,此片段允许按字母顺序显示操作。

使用Swagger制作WebApi的接口