【问题标题】:C# SwaggerGen + AutoRest - How to send a Stream body?C# SwaggerGen + AutoRest - 如何发送流体?
【发布时间】:2018-07-27 01:38:16
【问题描述】:

我想这是一个非常典型的场景:我们的解决方案公开了一个由 asp 核心 C# 控制器构建的 API,我们从中生成一个 swagger.json(使用 https://github.com/domaindrivendev/Swashbuckle.AspNetCore)。

我们通过使用 AutoRest (https://github.com/Azure/autorest) 生成的 C# 客户端在代码中调用此 api。

为了执行可能较大的上传,我们希望使用 AutoRest 生成的客户端将 Stream 从 C# 调用者传递到我们的后端,以避免必须序列化/反序列化一个完整的对象。

我不知道如何同时使用这两个工具来通过来自我们的 c# 代码的调用传入 Stream。我尝试将其添加为参数,但这会导致 AutoRest 为 System.IO.Stream 创建一个“流”模型,然后将其用作输入参数的类型,而不是仅保留原始类型。我已经尝试将它作为 [FromBody] 参数传递,但除了上述问题之外,AutoRest 还会在将其添加到请求而不是 StreamContent 之前将其键入为 StringContent (可能是因为 SwaggerGen 不将其识别为 Stream? )。

不胜感激 - 但如果我们不能这样做,我们总是可以手动使用 HTTPClient,我猜。

【问题讨论】:

    标签: c# asp.net-mvc swagger-codegen autorest


    【解决方案1】:

    我们无法解决这个问题,最终得到了一个不太理想的解决方案,但(对我们而言)仍然比使用手动生成的 HTTPClient 更可取。

    • 我们的 Swagger 模型不接收流(我们仍然使用流,我们只是直接从控制器内部的 AspNetCore 请求中获取它。我们有一个自定义验证器,可确保流存在并且具有非零长度)
    • 我们创建了一个部分类来配合我们自动生成的 api 客户端
    • 我们采用需要接受流的方法,并从自动生成的 api 客户端逐字复制它,并将其放入新的部分类中
    • 我们修改了自动生成代码的方法以接受 Stream
    • 我们修改了自动生成的代码,添加了以下内容:

              // BEGIN MANUALLY MODIFIED CODE
          _httpRequest.Content = new StreamContent(inputStream);
          // ensure that Expect Continue behaviour is always used for binary submissions
          _httpRequest.Headers.ExpectContinue = true;
          // END MANUALLY MODIFIED CODE 
      

    现在我们只使用这个手动生成的方法来调用该端点的所有调用,而不是自动生成的方法。这有几个重要的警告:

    • 如果 Swagger 模型发生变化,我们需要手动更新手动生成的方法
    • 任何模拟系统的人都需要知道我们的代码使用的是接受流的方法,而不是自动生成的方法

    【讨论】:

    • 这是一个很老的问题,但是你有没有设法让这个“正常”工作?
    • @rumblefx0 - 我不再参与这个项目了,但我刚刚快速浏览了它的公共托管存储库,黑客仍然存在。有一个注释可以重新审视 Swagger 3.0 的 hack。
    • 谢谢你的答案,我们会想办法的...... :)
    猜你喜欢
    • 1970-01-01
    • 2014-08-10
    • 2021-08-16
    • 2018-11-06
    • 2019-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多