2014-02-11 2 views
1

У меня есть приложение MVC 4 с SignalR, которое одновременно подключено к множеству Android-планшетов. Когда устройства переходят в спящий режим, некоторые из соединений теряются, а некоторые поддерживаются, по-видимому, без шаблона.Соединение SignalR потеряно, когда устройство Android отключено

У меня есть следующий код на представлении, чтобы попытаться перезапустить соединения при отключении:

$.connection.hub.disconnected(function() { 
     setTimeout(function() { 
      $.connection.hub.start(); 
     }, 5000); 
    }); 

Я также следующие строки в методе Application_Start():

GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromHours(6); 
    GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromHours(6); 

Я понимаю что 6 часов чрезмерны, это было просто сделано, чтобы попытаться обеспечить, чтобы соединение никогда не было таймаутом во время тестирования.

У меня также есть планшеты, предназначенные для поддержания Wi-Fi-соединения во время сна.

Однако, когда таблетки укладываются в сон, а затем пробуждаются всего несколько минут спустя, некоторые соединения по-прежнему будут активны, а другие - нет.

Как я могу гарантировать, что соединение SignalR будет либо сохранено, либо перезапущено, когда устройства возвращаются из сна?

ответ

0

Я разработал решение, которое работает.

По какой-то причине планшеты Android никогда не запускают функцию $ .connection.hub.disconnected().

Установка следующие значения в методе Application_Start() фиксируется вопрос

GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromHours(3); 
GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromHours(3); 
GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10); 

Эти значения устанавливаются очень большой, но я должен иметь как DisconnectTimeout и ConnectionTimeout больше, чем количество времени, что устройство спит. KeepAlive просто должен быть достаточно мал, чтобы стрелять в течение разумного времени после пробуждения.

Я бег этого приложения в контролируемой среде, так что это работает хорошо, но я уверен, что это не идеальное решение

+0

Кажется, это ужасная идея. Тем более, что вы никогда не будете поднимать разъединение на сервере (только через 3 часа). Поскольку сервер не очищает соединения, вы можете легко затопить его, и у него закончится нехватка памяти. – davidfowl

+0

Я согласен, но, как я уже сказал, это будет работать только в контролируемой среде, где я точно знаю, сколько соединений будет существовать. Я бы предпочел, чтобы планшеты снова включались, когда они возвращались из сна, но никакое решение, которое я нашел, не будет работать в 100% случаев – cmarcum

+0

Отлично. Если вы 100% осведомлены о последствиях, тогда все в порядке. – davidfowl

3

Следующий код из вашего вопроса, кажется, правильный путь идти о перезапуске соединения SignalR когда устройства возвращаются из сна:

$.connection.hub.disconnected(function() { 
    setTimeout(function() { 
     $.connection.hub.start(); 
    }, 5000); 
}); 

Конфигурация ConnectionTimeout не должен быть изменен для ваших целей , ConnectionTimeout используется почти исключительно транспортом длинного опроса, чтобы решить, как долго ждать нового сообщения, прежде чем закрыть текущий опрос и переполировать. По умолчанию это значение равно 110 секундам, потому что многие прокси убивают ожидающие HTTP-запросы более 2 минут.

Ускорение DisconnectTimeout до 6 часов, безусловно, является чрезмерным, как вы предлагаете. Это заставит сервер хранить потерянные соединения в памяти в течение шести часов.

This article on SignalR's connection lifetime должен обеспечить более глубокое понимание, если вы еще не прочитали его.

+0

Спасибо, я прочитал эту страницу и не смогли найти какие-либо решения, как еще. Удручает то, что я тестирую соединение на 12 устройствах одновременно, а некоторые возвращаются, а другие нет. И это разные устройства каждый раз. – cmarcum

+0

Is $ .connection.hub.start(); вызывается каждые пять секунд на устройствах, которые не возвращаются? – halter73

+0

Я установил предупреждение для запуска внутри функции setTimeout(), и оно не появляется. Насколько я могу сказать, устройства, которые не возвращаются, никогда не слышат событие hub.disconnected(). – cmarcum

0

Там ошибка в SignalR (версия 2.0.1 и ниже), в котором когда отключенное событие запускается после того, как клиент был подключен один раз, состояние остается подключенным или подключаемым (https://github.com/SignalR/SignalR/issues/2554 - решение в версии 2.0.2).

Вы можете обойти это, вызвав перезагрузку в тайм-аут:

$.connection.hub.disconnected(function() { 
    setTimeout(function() { 
     $.connection.hub.start() 
      .done(function() { 
       console.log('Connection establish! Now lets take over the world.'); 
       // DO STUFF HERE 
      }); 
    }, 10000); 
}); 
Смежные вопросы