我在C#中使用gRPC客户端,并使用了长期存在的双工流。但是,TCP连接有时会关闭,因此我想在客户端中使用keepalive。服务器(用Go编写)已经为Keepalive正确配置,并且已经用Go编写的客户端进行了测试。

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

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?

最佳答案

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

new ChannelOption("grpc.keepalive_permit_without_calls", 1)

关于c# - 在C#客户端中为gRPC设置keepalive,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45257255/

10-13 07:39