gpt4 book ai didi

C# SwaggerGen + AutoRest - 如何发送流主体?

转载 作者:太空宇宙 更新时间:2023-11-03 12:18:07 25 4
gpt4 key购买 nike

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

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

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

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

非常感谢任何建议 - 但如果我们不能这样做,我想我们总是可以手动使用 HTTPClient。

最佳答案

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

  • 我们的 Swagger 模型不接受 Stream(我们仍然使用 Stream,我们只是直接从 Controller 内的 AspNetCore Request 获取它。我们有一个自定义验证器,它确保流存在并且有一个非零长度)
  • 我们创建了一个部分类来配合我们自动生成的 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模型发生变化,我们需要手动更新手动生成的方法
  • 任何模拟系统的人都需要知道我们的代码使用了接受流的方法,而不是自动生成的方法

关于C# SwaggerGen + AutoRest - 如何发送流主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48821782/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com