关闭 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 失败。
我正在测试 .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 失败。