Я нарешті зрозумів це. Ось що я дізнався з початку цього запитання:
Передумови: Ми створюємо додаток для iOS за допомогою Xamarin / Monotouch та клієнта .NET SignalR 2.0.3. Ми використовуємо протоколи SignalR за замовчуванням - і, схоже, ми використовуємо SSE замість веб-сокетів. Я ще не впевнений, чи можливо використовувати веб-сокети з Xamarin / Monotouch. Все розміщується на веб-сайтах Azure.
Нам потрібна була програма для швидкого повторного підключення до нашого сервера SignalR, але ми постійно мали проблеми, коли з’єднання не підключалося самостійно - або повторне підключення зайняло рівно 30 секунд (через базовий час очікування протоколу).
Ми закінчили тестування на три сценарії:
Сценарій А - підключення під час першого завантаження програми. Це працювало бездоганно з першого дня. З'єднання завершується менш ніж за .25 секунд, навіть через мобільні з'єднання 3G. (припускаючи, що радіо вже включено)
Сценарій B - повторне підключення до сервера SignalR після того, як програма не працювала / не працювала протягом 30 секунд. У цьому випадку клієнт SignalR зрештою самостійно підключиться до сервера без особливої роботи, але, здається, він чекає рівно 30 секунд, перш ніж намагатись підключитися. (занадто повільно для нашого додатка)
Протягом цього 30-секундного періоду очікування ми спробували зателефонувати HubConnection.Start (), що не мало ефекту. А виклик HubConnection.Stop () також триває 30 секунд. Я знайшов відповідну помилку на сайті SignalR, яка, здається, була вирішена , але у нас все ще є та сама проблема у версії 2.0.3.
Сценарій C - повторне підключення до сервера SignalR після того, як програма не працювала / не працювала 120 секунд або довше. У цьому сценарії транспортний протокол SignalR вже вичерпано, тому клієнт ніколи не підключається автоматично. Це пояснює, чому іноді клієнт, але не завжди, самостійно підключався. Хороша новина полягає в тому, що виклик HubConnection.Start () працює майже миттєво, як сценарій А.
Тож мені знадобився деякий час, щоб зрозуміти, що умови повторного підключення були різними залежно від того, чи було додаток закрито на 30 секунд проти 120+ секунд. І хоча журнали трасування SignalR висвітлюють, що відбувається з базовим протоколом, я не вірю, що існує спосіб обробляти події транспортного рівня в коді. (подія Closed () спрацьовує через 30 секунд за сценарієм B, миттєво за сценарієм C; у власності штату вказано "Підключено" під час цих періодів очікування повторного підключення; жодних інших відповідних подій або методів)
Рішення:
Рішення очевидне. Ми не чекаємо, поки SignalR зробить магію відновлення. Натомість, коли додаток активовано або коли мережеве з’єднання телефону відновлено, ми просто очищаємо події та скасовуємо посилання на HubConnection (не можемо утилізувати його, оскільки це займає 30 секунд, сподіваємось, збір сміття подбає про це ) та створення нового екземпляра. Зараз все працює чудово. З якоїсь причини я подумав, що нам слід повторно використовувати постійне з’єднання та повторно підключатись, а не просто створювати новий екземпляр.