Сервер .Net Core SignalR для повторного подключения к серверу

Я пытаюсь узнать больше о повторном подключении сервера подключения к веб-сокету к серверу, когда моя служба веб-сокета выходит из строя. Я хорошо изучил документы и другие проблемы (в основном поиск клиента на сервере), но не могу решить, что я хочу реализовать.

Итак, цель состоит в том, чтобы микросервис A подключался к веб-сокету микросервиса B при запуске сервиса A. Все работает хорошо, но когда я отключаю службу B, состояние HubConnection всегда отключается в службе A, когда я снова загружаю B. Так, например, используя 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);
        }
    }

когда я смотрю на _hubConnection в AddMessage после того, как я останавливаю и запускаю службу B и вызываю AddMessage.. Я вижу следующие свойства на HubConnection:

HandshakeTimeout: 15 seconds,
KeepAliveInterval: 15 seconds,
ServerTimeout: 30 seconds,
State: Disconnected

Из того, что я прочитал, может быть, я все еще неправильно понимаю использование HandshakeTimeout, KeepAliveInterval и ServerTimeout.. может быть, я могу использовать один из них для повторного подключения службы A после запуска службы B? Или я вижу, что тип HubConnection имеет .On<>, может быть, мне нужно поймать Disconnect и повторить вызов вручную? Любая информация о том, как я могу обрабатывать переподключения между серверами в этом смысле, очень ценится!


person Shawn    schedule 13.08.2019    source источник


Ответы (1)


Вы можете использовать Полли, когда ваше соединение не работает. 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);
    }
}
person Yigit Tanriverdi    schedule 18.08.2019