Треугольный шаблон повторного соединения 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