关闭 Wi-Fi 时处理网络问题

Handle network issues when wi-fi is switched off

我正在测试 .NET 版本的 gRPC 以了解如何处理网络故障。我把服务器放到一台外部机器上调试客户端。服务器每秒发送一条消息,客户端只在控制台上显示它。因此,当我停止本地 Wi-Fi 连接几秒钟时,gRPC 引擎会自动恢复,我什至可以获得剩余的值。但是,如果我将 Wi-Fi 禁用一分钟之类的较长时间,它就会卡住。我什至没有得到任何异常,所以我可以处理这种情况并手动恢复。当我手动关闭服务器应用程序时,这种情况工作正常,然后客户端会发生异常。这是我在客户端上的内容:

static async Task Main(string[] args)
{
    try
    {
        await Subscribe();
    }
    catch (Exception)
    {
        Console.WriteLine("Fail");
        Thread.Sleep(1000);
        await Main(args);
    }

    Console.ReadLine();
}

private static async Task Subscribe()
{
    using var channel = GrpcChannel.ForAddress("http://x.x.x.x:5555");
    var client = new Greeter.GreeterClient(channel);
    var replies = client.GerReplies(new HelloRequest { Message = "Test" });
    while (await replies.ResponseStream.MoveNext(CancellationToken.None))
    {
        Console.WriteLine(replies.ResponseStream.Current.Message);
    }
    Console.WriteLine("Completed");
}

这在服务器应用程序停止时有效,但如果我只是在客户端禁用本地 Wi-Fi 连接,它就不起作用。我该如何处理这种情况和类似情况?

我已经通过KeepAlivePingDelay设置解决了这个问题:

var handler = new SocketsHttpHandler
{
    KeepAlivePingDelay = TimeSpan.FromSeconds(5),
    KeepAlivePingTimeout = TimeSpan.FromSeconds(5),
};
using var channel = GrpcChannel.ForAddress("http://x.x.x.x:5555", new GrpcChannelOptions
{
    HttpHandler = handler
});

如果没有连接,此配置会在 10 秒后强制 gRPC 失败。