首页 文章

C#SwaggerGen AutoRest - 如何发送Stream正文?

提问于
浏览
2

我想这是一个非常典型的场景:我们的解决方案公开了一个由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创建一个“Stream”模型,然后将其用作输入参数的类型,而不是仅保留原始类型 . 我已经尝试将其作为[FromBody]参数传递,但除了上面的问题之外,AutoRest还会在将其添加到请求之前将其键入StringContent而不是StreamContent(可能因为SwaggerGen不将其识别为流? ) .

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

1 回答

  • 1

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

    • 我们的Swagger模型没有接收Stream(我们仍然使用Stream,我们只是直接从我们控制器内的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
    

    现在我们只是将这个手动生成的方法用于对该 endpoints 的所有调用,而不是自动生成的方法 . 这带来了几个重要的警告:

    • 如果Swagger模型发生变化,我们需要手动更新手动生成的方法

    • 任何模拟系统的人都需要知道我们的代码使用接受流的方法,而不是自动生成的方法

相关问题