Saya akhirnya menemukan ini. Inilah yang saya pelajari sejak memulai pertanyaan ini:
Latar belakang: Kami sedang membangun aplikasi iOS menggunakan Xamarin / Monotouch dan klien .NET SignalR 2.0.3. Kami menggunakan protokol SignalR default - dan tampaknya menggunakan SSE, bukan soket web. Saya belum yakin apakah mungkin menggunakan soket web dengan Xamarin / Monotouch. Semuanya dihosting menggunakan situs web Azure.
Kami membutuhkan aplikasi untuk terhubung kembali ke server SignalR kami dengan cepat, tetapi kami terus mengalami masalah di mana koneksi tidak terhubung kembali dengan sendirinya - atau menghubungkan kembali membutuhkan waktu tepat 30 detik (karena waktu tunggu protokol yang mendasarinya).
Ada tiga skenario yang akhirnya kami uji:
Skenario A - menghubungkan pertama kali aplikasi dimuat. Ini bekerja dengan sempurna sejak hari pertama. Koneksi selesai dalam waktu kurang dari 0,25 detik bahkan melalui koneksi seluler 3G. (dengan asumsi radio sudah menyala)
Skenario B - menyambungkan kembali ke server SignalR setelah aplikasi menganggur / ditutup selama 30 detik. Dalam skenario ini, klien SignalR pada akhirnya akan menyambung kembali ke server sendiri tanpa pekerjaan khusus - tetapi tampaknya menunggu tepat 30 detik sebelum mencoba menyambung kembali. (terlalu lambat untuk aplikasi kita)
Selama masa tunggu 30 detik ini, kami mencoba memanggil HubConnection.Start () yang tidak berpengaruh. Dan memanggil HubConnection.Stop () juga membutuhkan waktu 30 detik. Saya menemukan bug terkait di situs SignalR yang tampaknya telah diselesaikan , tetapi kami masih mengalami masalah yang sama di v2.0.3.
Skenario C - menghubungkan kembali ke server SignalR setelah aplikasi menganggur / ditutup selama 120 detik atau lebih. Dalam skenario ini, protokol transport SignalR telah habis waktunya sehingga klien tidak pernah terhubung kembali secara otomatis. Ini menjelaskan mengapa klien terkadang tetapi tidak selalu menyambung kembali sendiri. Kabar baiknya adalah, memanggil HubConnection.Start () berfungsi hampir secara instan seperti skenario A.
Jadi, perlu beberapa saat bagi saya untuk menyadari bahwa kondisi penyambungan kembali berbeda berdasarkan apakah aplikasi ditutup selama 30 detik vs 120+ detik. Dan meskipun log pelacakan SignalR menerangi apa yang terjadi dengan protokol yang mendasarinya, saya tidak percaya ada cara untuk menangani peristiwa tingkat pengangkutan dalam kode. (Peristiwa Closed () menyala setelah 30 detik dalam skenario B, langsung dalam skenario C; properti Negara menyatakan "Tersambung" selama periode tunggu penghubung kembali ini; tidak ada peristiwa atau metode relevan lainnya)
Solusi:
Solusinya jelas. Kami tidak menunggu SignalR melakukan keajaiban penyambungan kembali. Sebaliknya, ketika aplikasi diaktifkan atau ketika koneksi jaringan ponsel dipulihkan, kami hanya membersihkan acara dan membatalkan referensi HubConnection (tidak dapat membuangnya karena membutuhkan waktu 30 detik, semoga pengumpulan sampah akan menanganinya ) dan membuat instance baru. Sekarang semuanya bekerja dengan baik. Untuk beberapa alasan, saya pikir kita harus menggunakan kembali koneksi yang ada dan menghubungkan kembali daripada hanya membuat contoh baru.