Sonunda bunu çözdüm. İşte bu soruya başladığımdan beri öğrendiklerim:
Arka plan: Xamarin / Monotouch ve .NET SignalR 2.0.3 istemcisini kullanarak bir iOS uygulaması oluşturuyoruz. Varsayılan SignalR protokollerini kullanıyoruz - ve web soketleri yerine SSE kullanıyor gibi görünüyor. Xamarin / Monotouch ile web soketlerini kullanmanın mümkün olup olmadığından henüz emin değilim. Her şey Azure web siteleri kullanılarak barındırılır.
Uygulamanın SignalR sunucumuza hızlı bir şekilde yeniden bağlanmasına ihtiyacımız vardı, ancak bağlantının kendi kendine yeniden bağlanmadığı veya yeniden bağlanmanın tam olarak 30 saniye sürdüğü (temel protokol zaman aşımından dolayı) sorunlar yaşamaya devam ettik.
Test ettiğimiz üç senaryo vardı:
Senaryo A - uygulama ilk yüklendiğinde bağlanma. Bu, ilk günden itibaren kusursuz bir şekilde çalıştı. Bağlantı, 3G mobil bağlantılarda bile .25 saniyeden daha kısa sürede tamamlanır. (radyonun zaten açık olduğunu varsayarak)
Senaryo B - uygulama 30 saniye boşta kaldıktan / kapatıldıktan sonra SignalR sunucusuna yeniden bağlanma. Bu senaryoda, SignalR istemcisi sonunda herhangi bir özel çalışma olmaksızın sunucuya kendi başına yeniden bağlanacaktır - ancak yeniden bağlanmayı denemeden önce tam olarak 30 saniye beklediği görülmektedir. (uygulamamız için çok yavaş)
Bu 30 saniyelik bekleme süresi boyunca, etkisi olmayan HubConnection.Start () 'ı çağırmayı denedik. HubConnection.Stop () 'u çağırmak da 30 saniye sürer. SignalR sitesinde çözülmüş gibi görünen ilgili bir hata buldum , ancak v2.0.3'te hala aynı sorunu yaşıyoruz.
Senaryo C - uygulama 120 saniye veya daha uzun süre boşta kaldıktan / kapatıldıktan sonra SignalR sunucusuna yeniden bağlanma. Bu senaryoda, SignalR aktarım protokolü zaten zaman aşımına uğradı, bu nedenle istemci asla otomatik olarak yeniden bağlanmaz. Bu, müşterinin neden bazen ancak her zaman kendi kendine yeniden bağlantı kurduğunu açıklar. İyi haber, HubConnection.Start () 'ı çağırmak neredeyse anında senaryo A gibi çalışır.
Bu nedenle, uygulamanın 30 saniyeye karşı 120 saniyeden fazla kapalı olmasına bağlı olarak yeniden bağlanma koşullarının farklı olduğunu anlamam biraz zaman aldı. Ve SignalR izleme günlükleri temeldeki protokolde neler olup bittiğini aydınlatsa da, koddaki taşıma düzeyi olaylarını ele almanın bir yolu olduğuna inanmıyorum. (Closed () olayı, senaryo B'de 30 saniye sonra, C senaryosunda anında tetiklenir; State özelliği, bu yeniden bağlanma bekleme süreleri sırasında "Bağlı" der; başka ilgili olay veya yöntem yoktur)
Çözüm: Çözüm
ortada. SignalR'ın yeniden bağlanma sihrini yapmasını beklemiyoruz. Bunun yerine, uygulama etkinleştirildiğinde veya telefonun ağ bağlantısı geri yüklendiğinde, yalnızca olayları temizliyoruz ve HubConnection referansını kaldırıyoruz (30 saniye sürdüğü için onu atamıyoruz, umarım çöp toplama işi halleder. ) ve yeni bir örnek oluşturma. Şimdi her şey harika çalışıyor. Bazı nedenlerden dolayı, sadece yeni bir örnek oluşturmak yerine kalıcı bir bağlantıyı yeniden kullanmamız ve yeniden bağlanmamız gerektiğini düşündüm.