在C#客户端中为gRPC设置保持连接功能

7

我正在使用C#中的gRPC客户端,并使用长期存在的双工流。然而,TCP连接在某个时候关闭,因此我想在客户端中使用保持活动功能。服务器(用Go编写)已正确配置为保持活动,并已与用Go编写的客户端进行了测试。

我使用以下代码设置5分钟的keepalive,并启用跟踪以查看所有传入/传出的字节。

Environment.SetEnvironmentVariable("GRPC_TRACE", "tcp,channel,http,secure_endpoint");
Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG");

var callCredentials = CallCredentials.FromInterceptor(Interceptor());

var roots = Encoding.UTF8.GetString(Resources.roots);

Channel = new Channel(address, ChannelCredentials.Create(new SslCredentials(roots), callCredentials), new[]
{
    new ChannelOption("grpc.keepalive_time_ms", 5 * 60 *  1000), // 5 minutes
});

await Channel.ConnectAsync(DateTime.UtcNow.AddSeconds(5));

然而,在日志中,5分钟内没有发送任何字节,如果流在一段时间内处于空闲状态,则连接将关闭,因为我无法再通过同一流发送/接收消息。

我应该如何正确启用keepalive?

1个回答

3

尝试在客户端中添加以下ChannelOption。

new ChannelOption("grpc.keepalive_permit_without_calls", 1)

2
请参阅 https://github.com/grpc/grpc/blob/master/doc/keepalive.md 以获取有关grpc中保持活动的文档。 - bobuva
@calven 你怎么才能捕获服务器离线的情况? - Venelin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接