gRPC 服务器流是不是可以将流返回到 Blazor Wasm 而不是 IAsyncEnumerable<T>?

Posted

技术标签:

【中文标题】gRPC 服务器流是不是可以将流返回到 Blazor Wasm 而不是 IAsyncEnumerable<T>?【英文标题】: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 方法处理程序的一些低级黑客。总体而言,这是仅限专家的领域,我建议不要这样做,因为性能改进不值得额外的复杂性(除非您之前进行过广泛的分析并且这是您应用程序的瓶颈)。跨度> 【参考方案1】:

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

var streamContent = new byte[] ;
await foreach(var chunk in your_iasyncenumerable)

    streamContent.Concat(chunk);
 

【讨论】:

循环并创建字节数组不是我的目标,我需要将文件流式传输到磁盘以保留内存分配。 您的意思是将文件流式传输到FileStream 而不是MemoryStream

以上是关于gRPC 服务器流是不是可以将流返回到 Blazor Wasm 而不是 IAsyncEnumerable<T>?的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭服务器的grpc流

将流写入缓冲区对象

使用 go 将流文件上传到 AWS S3

使用 WebRTC 从网络摄像头捕获媒体流,将流发布到媒体服务器并从那里分发

检查 gRPC 流何时为空或不是流式传输数据

将流嵌入网站