【问题标题】:How do I retrieve streaming results using Grpc in .Net Core?如何在 .Net Core 中使用 Grpc 检索流式传输结果?
【发布时间】:2021-06-21 20:50:17
【问题描述】:

我正在使用 gRPC 构建一个 .NetCore 应用程序。

我在构建代码以处理流式传输结果时遇到问题。

考虑以下 protobuf 定义:

service SampleService
{
    rpc RegisterClient(G_ClientRequest) returns (stream G_ClientResponse) { }
}

这是一个从流中读取结果的代码 sn-p:

public ConnectToClient()
{
    var results = Client.RegisterClient(new G_ClientRequest() 
    { 
        ClientName = "Foo",
        DateTimeStamp = new Google.Protobuf.WellKnownTypes.Timestamp()
    });
    
    var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
    foreach (var result in results.ResponseStream.ReadAllAsync(cancellationToken: cts.Token))
    {

    }   
}

我一直在谷歌搜索,发现与我上面处理流媒体结果的代码类似。但是代码无法编译。 ReadAllAsync()IAsyncStreamReader 的接口定义中不可用。

.Net Core 中是否不提供/支持此功能?我正在使用最新的稳定版 Grpc (2.38)。

如果这对我不可用,我如何从 .Net Core 中的 ResponseStream 检索结果?

谢谢,约翰B

【问题讨论】:

  • 第三方,但 protobuf-net.Grpc 使用 IAsyncEnumerable-T 公开常规 gRPC API,所以:await foreach 就完成了

标签: c# .net-core grpc grpc-dotnet


【解决方案1】:

根据 gRPC 文档,接口 IAsyncStreamReader 没有 ReadAllAsync() 方法。

https://grpc.github.io/grpc/csharp/api/Grpc.Core.IAsyncStreamReader-1.html

【讨论】:

  • 是的,我看到了。然后我还看到了一些要求它的功能请求以及一些似乎正在使用它的示例......,因此造成了混乱。
【解决方案2】:

ReadAllAsync 是 Grpc.Core 中包含的一个扩展,如果你已经安装了 Nuget 包 Grpc.Net.Client 只需添加:

using Grpc.Core;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-13
    • 2019-09-29
    • 2017-04-14
    • 2020-10-10
    • 2019-07-03
    • 2014-12-22
    • 1970-01-01
    • 2017-11-22
    相关资源
    最近更新 更多