我试图了解有关在我的Web套接字服务中断时将Websocket连接服务器重新连接到服务器的更多信息。我已经很好地研究了文档和其他问题(主要是找到服务器的客户端),但是无法确定我要实现的目标。
所以目标是当服务A启动时,我将微服务A连接到微服务B上的Web套接字。一切正常,但是当我关闭服务B时,当我重新启动B时,服务A中的HubConnection状态总是断开。例如,使用Microsoft.AspNetCore.SignalR.Client 1.1.0
public class MessageHubProxy : IMessageHubProxy
{
private readonly HubConnection _hubConnection;
public MessageHubProxy()
{
_hubConnection = new HubConnectionBuilder().WithUrl("http://localhost:54994/messageHub").Build();
InitiateConenction().Wait();
}
private async Task InitiateConenction()
{
await _hubConnection.StartAsync();
}
public void AddMessage(string message)
{
_hubConnection.InvokeAsync("addMessage", post);
}
}
当我停止并启动服务B并调用AddMessage之后在AddMessage中查看_hubConnection
时。我在HubConnection
上看到以下属性:
HandshakeTimeout: 15 seconds,
KeepAliveInterval: 15 seconds,
ServerTimeout: 30 seconds,
State: Disconnected
从我读到的内容来看,也许我仍然对HandshakeTimeout,KeepAliveInterval和ServerTimeout的使用产生误解。也许在服务B启动并运行后,我可以使用其中之一重新连接服务A?或者我看到HubConnection类型有一个.On<>
,也许我需要捕获Disconnect并手动调用重试?在这种意义上,我如何处理服务器到服务器的任何信息都将受到赞赏!
答案 0 :(得分:4)
当连接失败时,可以使用Polly。 https://github.com/App-vNext/Polly
public class MessageHubProxy : IMessageHubProxy
{
private readonly HubConnection _hubConnection;
public MessageHubProxy()
{
_hubConnection = new HubConnectionBuilder().WithUrl("http://localhost:54994/messageHub").Build();
Policy
.Handle<Exception>()
.WaitAndRetry(5, r => TimeSpan.FromSeconds(5), (ex, ts) => { Log.Error("Error connecting to DB. Retrying in 5 sec."); })
.Execute(() => InitiateConenction());
}
private async Task InitiateConenction()
{
await _hubConnection.StartAsync();
}
public void AddMessage(string message)
{
_hubConnection.InvokeAsync("addMessage", post);
}
}