Мы столкнулись с этой ссылкой, которая определяет различные свойства тайм-аута: https://github.com/SignalR/SignalR/wiki/Configuring-SignalR
А также этот отличный пост (Когда происходит повторное подключение в signalR occour?) о том, как разъединения и повторные соединения происходят между клиентом SignalR и сервером SignalR.
Просто повторите итерацию различных ситуаций из вышеприведенного сообщения:
"Повторное подключение концентратора происходит, когда клиент переходит в автономный режим, а затем восстанавливает соединение вскоре после этого. Значения конфигурации SignalR в значительной степени определяют отметки времени следующих примеров, поэтому не принимайте время дословно.
Вот несколько примеров и их результаты (формат времени m: ss), включающий повторное подключение:
Ситуация 1
0:00 - Клиент подключается к серверу, инициируется OnConnected
0:10 - Клиент теряет соединение из-за проблем с провайдером (и понимает, что он теряет соединение)
0:15 - Клиент восстанавливает подключение
0:16 - инициировано событие OnReconnected
Ситуация 2
0:00 - Клиент подключается к серверу, инициируется OnConnected
0:10 - Клиент теряет соединение из-за вытягивания сетевого кабеля (не понимает, что он отключен)
0:15 - Клиент восстанавливает подключение
Здесь могут произойти две вещи.
A: 0:16 - Ничего не происходит, и клиент продолжает свое предыдущее соединение
B: 0: ~ 45 - Клиент реализует свой отключенный *
B: 0:46 - Клиент переходит в состояние повторного подключения
B: 0:47 - Клиент успешно повторно подключается и инициируется событие OnReconnected.
Ситуация 3
0:00 - Клиент подключается к серверу, инициируется OnConnected
0:10 - Клиент теряет соединение из-за вытягивания сетевого кабеля (не понимает, что он отключен)
0: ~ 45 - Клиент реализует свой отключенный *
0:46 - Клиент переходит в состояние повторного подключения
1:15 - Сервер определяет, что клиент слишком долго ушел, а затем забыл об этом, поставив в очередь команду "отключить" для клиента, если он снова подключится позже. ***
1:15 - срабатывает OnDisconnect 1:16 - Клиент восстанавливает соединение
1:17 - Клиент выполняет "мягкое" повторное подключение (не вызывает OnReconnected)
1:18 - Клиент извлекает команду "отключить"
1:19 - Клиент вызывает "стоп" и выполняет мягкое разъединение (не запускает OnDisconnected)
Ситуация 4
0:00 - Клиент подключается к серверу, инициируется OnConnected
0:10 - Клиент теряет соединение из-за вытягивания сетевого кабеля (не понимает, что он отключен)
0: ~ 45 - Клиент реализует свой отключенный *
0:46 - Клиент переходит в состояние повторного подключения
1:15 - Сервер определяет, что клиент слишком долго ушел, а затем забыл об этом, поставив в очередь команду "отключить" для клиента, если он снова подключится позже. ***
1:15 - срабатывает OnDisconnect 1:30 - Клиент перестает пытаться подключиться (слишком долго пытается) **
1:30 - Клиент переходит в отключенное состояние
- В связи с проверкой на стороне клиента проверка: используется для определения того, когда клиент отключен из-за отсутствия поддержки. Не используется для долгого опроса транспорта.
** Из-за таймаута отключения соединения на стороне клиента: используется, чтобы определить, когда клиент повторно соединяется в течение слишком длительного периода, и, скорее всего, сервер забыл о клиенте в течение времени
*** Из-за тайм-аута отключения сервера: используется для определения того, когда клиент должен быть забыт. Это промежуток времени, который начинает нарастать, как только соединение помечено как мертвое на сервере. В конечном счете сервер ставит в очередь команду disconnect для темы клиента, которая сообщает клиенту (если он повторно подключается), что ему нужно запустить новое соединение. Команда исчезнет с сервера при очистке темы. "
Что мы находим, так это то, что мы часто получаем разъединения и повторно подключаемся (1 и 2 выше) между клиентом .NET SignalR и сервером SignalR ASP.NET MVC, а также отключается, что не приводит к переподключениям (3 и 4 выше). Мы знаем, что используется протокол ServerSentEvents.
Трудно узнать, какие свойства тайм-аута нужно настроить (увеличить или уменьшить) до:
- Уменьшите количество отключений и снова подключитесь.
- Не заканчивается в ситуациях 3 и 4 вообще.
Важно отметить, что наш клиент .NET SignalR на самом деле является службой Windows, которая постоянно подключается к серверу.
В настоящее время мы просто сохранили значения по умолчанию:
- ConnectionTimeout = 110 секунд
- DisconnectTimeout = 30 секунд
- KeepAlive = 30 секунд
Кроме того, мы используем SignalR 1.0.1.