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<T>
,但 DotNetStreamReference
类只接受 Stream
对象作为输入。
有办法将IAsyncEnumerable<byte[]>
转换为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>?的主要内容,如果未能解决你的问题,请参考以下文章