Как реализовать автоматическое переподключение SignalR
В этой статье мы узнаем, как реализовать автоматическое переподключение в SignalR
. Раньше нам приходилось реализовывать собственные механизмы автоматического переподключения SignalR
. Но это непростая задача. При реализации такого решения нам необходимо принять во внимание множество вещей. Хорошей новостью является то, что в ASP.NET Core 3.0 SignalR
представил функцию автоматического повторного подключения , которая поможет нам решить эту проблему. В этой статье мы рассмотрим эту функцию и способы ее реализации в нашем приложении SignalR
. SignalR
использует WebSockets
под капотом, что обеспечивает двустороннюю связь между браузером и сервером. Это означает, что он будет использовать WebSockets
всякий раз, когда это возможно, и корректно вернется к другим методам, когда соединение WebSocket
не может быть установлено. Обычно через некоторое время соединения WebSocket
автоматически отключаются. В версиях SignalR
до 3.х при потере соединения SignalR
не пытался автоматически повторно подключиться. Таким образом, мы потеряем поведение нашего приложения в реальном времени. Тогда единственный способ восстановить соединение — обновить страницу. Это создает неприятные ощущения у пользователей.
Опция автоматического переподключения SignalR
Как мы обсуждали во введении, SignalR добавил поддержку автоматического переподключения в ASP.NET Core 3.0 . Для этого версия SignalR Javascript Client должна быть 3.0.0 или выше. Мы можем настроить клиент Javascript для SignalR на автоматическое переподключение с помощью метода on . Однако это не поведение по умолчанию, и нам нужно явно вызвать этот метод .withAutomaticReconnect()
HubConnectionBuilder. Мы можем настроить поведение, withAutomaticReconnect()
предоставив аргумент. В качестве аргумента он принимает массив значений миллисекунд. Это обозначает время ожидания клиента перед каждой попыткой повторного подключения. Если мы не передаем никаких параметров, withAutomaticReconnect()
настраивает клиент на ожидание 0, 2, 10 и 30 секунд соответственно перед попыткой каждого повторного подключения. Наконец, он остановится после четырех неудачных попыток.
Реализация автоматического переподключения SignalR
Итак, мы собираемся изменить startConnection()метод класса SignalRService, чтобы включить автоматическое переподключение:
this.hubConnection = new signalR.HubConnectionBuilder()
.withUrl('https://localhost:5001/chart')
.withAutomaticReconnect()
.configureLogging(signalR.LogLevel.Information)
.build();
Здесь мы вызываем withAutomaticReconnect()
метод без каких-либо параметров. Таким образом, перед каждой попыткой повторного подключения будет происходить ожидание 0, 2, 10 и 30
секунд соответственно. Наконец, он остановится после четырех неудачных попыток. Конечно, мы можем настроить это, передав набор пользовательских значений в качестве аргумента. Это эквивалентно передаче [0, 2000, 10000, 30000, null]
в качестве аргумента. Мы можем настроить количество повторных попыток и задержек, передав нужные значения в виде массива в аргументе. Кроме того, мы вызвали метод, configureLogging()
передав LogLevel
аргумент как LogLevel.Information
. Это позволит настроить ведение журнала консоли для HubConnection
экземпляра. Аргумент LogLevel.Information
включит регистрацию всех событий с информацией о серьезности или более в консоли. Мы сделали это для того, чтобы иметь возможность получать журнал всех событий, происходящих в фоновом режиме.
Вот и все. Мы настроили наше приложение SignalR
для автоматического повторного подключения.
Запрос данных в реальном времени после повторного подключения
На этом этапе мы включили наше клиентское приложение для автоматического повторного подключения к нашему серверному приложению с помощью SignalR
, но теперь мы не получаем данные в реальном времени. Соединение снова восстановлено, как мы можем видеть в нашей презентации, но диаграмма заморожена, поскольку мы не получаем никаких новых данных с сервера.
Чтобы включить поток данных, как только соединение снова станет активным, нам нужно использовать функцию onreconnected
, которую мы можем вызвать с нашим hubConnectionсвойством внутри службы Signalr
:
this.hubConnection.onreconnected(() => {
this.http.get('https://localhost:5001/api/chart')
.subscribe(res => {
console.log(res);
})
})
На этот раз, как только наше приложение снова подключится, мы получим данные с сервера.
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.