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

Sha*_*awn 4 websocket signalr signalr.client asp.net-core 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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

当我在_hubConnection停止并启动服务 B 并调用 AddMessage 后查看 AddMessage 时。我在 .. 上看到以下属性HubConnection

HandshakeTimeout: 15 seconds,
KeepAliveInterval: 15 seconds,
ServerTimeout: 30 seconds,
State: Disconnected
Run Code Online (Sandbox Code Playgroud)

从我读到的内容来看,也许我仍然误解了 HandshakeTimeout、KeepAliveInterval 和 ServerTimeout 的使用。也许我可以使用其中之一让服务 A 在服务 B 启动并运行后重新连接?或者我看到 HubConnection 类型有一个.On<>,也许我需要捕获 Disconnect 并手动调用重试?非常感谢我如何处理服务器到服务器重新连接的任何信息!

小智 5

当您的连接失败时,您可以使用 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);
    }
}
Run Code Online (Sandbox Code Playgroud)