Треугольный шаблон повторного соединения SignalR
Я работаю с SignalR в очень специфическом наборе сетевых условий (сумасшедший прокси). Так что сокеты вообще не работают, и мне приходится использовать длинный опрос. Когда я обновляю страницу, она работает некоторое время, но затем происходит первое отключение. Я пытаюсь автоматически подключиться к отключенному событию и следующему шаблону:
- После загрузки страницы концентратор отключается примерно через 110 секунд (время ожидания по умолчанию)
- Для перезапуска концентратора после первого отключения требуется 3 отключенных события (поэтому он подключается только к 4-й попытке).
- После этого он всегда подключается к первой попытке, но отключается примерно через 10-15 секунд (не 110 секунд). Таким образом, похоже, что тайм-аут keep-alive здесь каким-то образом включен (пока он не был с первой попытки).
Такое поведение кажется странным. Есть ли что-нибудь, что я могу сделать, чтобы улучшить его?
Ответы
Ответ 1
Предположим, что советы доступны в Понимание и обработка событий продолжительности жизни в SignalR, где вы можете использовать хорошие решения для обработки времени жизни на основе сетевой проблемы, Кроме того, в проблемах SignalR я нашел следующее решение для вас, которое также работает с длинным опросом.
Вы можете установить свойство KeepAlive
в ConfigurationManager
, а SignalR отправит пустой кадр данных (на основе транспорта) в указанный интервал, чтобы поддерживать соединение в живом состоянии (посмотрите Разрешить хосту указывать время сохранения). Текущий механизм тайм-аута делает потоковые протоколы разными.
Ответ 2
Использовать ConnectionStatusStream. Этот поток OnNexts, когда вызываются события прокси-сервера SignalR на стороне клиента. Таким образом, мы видим такие вещи, как "Подключение", "Подключено", "Соединение", "Повторное подключение", "Подключено", "Закрыто", "Неинициализировано". Все из них начали жизнь как события на прокси-сервере SignalR и были включены в поток IObservable с использованием одной из многих фабрик RX. В этом случае IObservable.FromEvent.
В любом случае, это общая модель ConnectivityStatusViewModel, которую мы используем для отображения информации в нижней строке состояния приложения.
Обратите внимание:
ConnectionStatusStream