在 Web API 中转发和存储请求流

本文关键字:存储 请求 转发 Web API | 更新日期: 2023-09-27 18:33:20

我有一个服务,使用 ASP.NET Web API 2编写。其中一部分涉及接收图像并将其转发到不同的 Web 服务(在不同的机器上(。因此,流程为:

  • 客户端对我的服务执行 HTTP POST,将二进制图像作为正文。
  • 在我的控制器中,我调用 Request.Content.ReadAsStreamAsync((。
  • 该流最终作为 HTTP 请求的正文异步发送。

通过这种设计,我相信字节在收到时会转发到其他服务,因此我们不需要等待整个图像被读取后再发送它们。

这很好,但现在我想存储图像的副本,以供以后分析。

  • 我不能只使用Stream.Seek(0,SeekOrigin.Begin(,因为流在第一次读取后就关闭了。
  • 我可以使用 ReadAsByteArrayAsync((,将其包装在 MemoryStream 中,然后轻松地将其发送到远程服务和 Azure blob 存储。但这会减慢服务速度,因为在发送之前需要读取整个图像。

有没有我没有考虑过的替代方法?我关于将请求流传递给另一个请求的基本假设是否有效?

在 Web API 中转发和存储请求流

多亏了一位同事的指针,我最终找到了这个示例,它展示了如何使用同时写入原始流和文件的内容包装 HttpContent:http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/ResponseEntityProcessorSample/Handlers/HttpContentProcessor.cs

此示例演示如何异步中继请求: http://aspnet.codeplex.com/SourceControl/latest#Samples/WebApi/RelaySample/Controllers/RelayController.cs