3

我想这是一个非常典型的场景:我们的解决方案公开了一个由 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,我猜。

4

1 回答 1

2

我们无法解决这个问题,最终得到了一个不太理想的解决方案,它仍然(对我们而言)比使用手动生成的 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 模型发生变化,我们需要手动更新手动生成的方法
  • 任何模拟系统的人都需要知道我们的代码使用了接受流的方法,而不是自动生成的方法
于 2018-09-12T04:20:09.913 回答