.Net Core SignalR服务器到服务器重新连接

时间:2019-08-13 02:40:07

标签: asp.net-core websocket signalr signalr.client asp.net-core-signalr

我试图了解有关在我的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

从我读到的内容来看,也许我仍然对Han​​dshakeTimeout,KeepAliveInterval和ServerTimeout的使用产生误解。也许在服务B启动并运行后,我可以使用其中之一重新连接服务A?或者我看到HubConnection类型有一个.On<>,也许我需要捕获Disconnect并手动调用重试?在这种意义上,我如何处理服务器到服务器的任何信息都将受到赞赏!

1 个答案:

答案 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);
    }
}