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

.Net Core SignalR server to server reconnect

我正在尝试了解有关在我的网络套接字服务出现故障时将网络套接字连接服务器重新连接到服务器的更多信息。我已经仔细查看了文档和其他问题(主要是寻找客户端到服务器),但无法决定我要实现什么。

所以目标是当服务 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 的使用。也许我可以使用其中之一让服务 A 在服务 B 启动后重新连接 运行?或者我看到 HubConnection 类型有一个 .On<>,也许我需要捕获 Disconnect 并手动调用重试?非常感谢任何关于我如何处理服务器到服务器重新连接的信息!

您可以在连接失败时使用 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);
    }
}