【问题标题】:Can gRPC server stream return a Stream to Blazor Wasm instead of IAsyncEnumerable<T>?gRPC 服务器流是否可以将流返回到 Blazor Wasm 而不是 IAsyncEnumerable<T>?
【发布时间】:2021-11-23 15:53:38
【问题描述】:

我需要使用 gRPC 将文件从 ASP.NET Core 流式传输到 Blazor WASM。

我想使用 net6 中添加的新类 DotNetStreamReference 以允许使用 JSInterop 直接流到磁盘(请参阅 https://docs.microsoft.com/en-us/aspnet/core/blazor/file-downloads?view=aspnetcore-6.0)。

现在,问题是:gRPC 方法流数据返回 IAsyncEnumerable&lt;T&gt;,但 DotNetStreamReference 类只接受 Stream 对象作为输入。

有办法将IAsyncEnumerable&lt;byte[]&gt; 转换为Stream 或最终从gRPC 调用返回Stream

谢谢

【问题讨论】:

  • 我认为没有修改 Grpc 代码的方法可以做到这一点,但您可能会幸运地使用自定义序列化器和反序列化器 github.com/grpc/grpc/blob/… 和自定义 grpc 方法处理程序的一些低级黑客。总体而言,这是仅限专家的领域,我建议不要这样做,因为性能改进不值得额外的复杂性(除非您之前进行过广泛的分析并且这是您应用程序的瓶颈)。跨度>

标签: c# blazor grpc filestream .net-6.0


【解决方案1】:

我不确定 gRPC 部分,但对于“转换”问题,肯定是:

var streamContent = new byte[] {};
await foreach(var chunk in your_iasyncenumerable)
{
    streamContent.Concat(chunk);
} 

【讨论】:

  • 循环并创建字节数组不是我的目标,我需要将文件流式传输到磁盘以保留内存分配。
  • 您的意思是将文件流式传输到FileStream 而不是MemoryStream
猜你喜欢
  • 1970-01-01
  • 2020-03-13
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2017-05-28
  • 2011-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多