2015-08-28 7 views
11

Ich arbeite mit SignalR unter sehr spezifischen Netzwerkbedingungen (ein verrückter Proxy). Also funktionieren Sockets überhaupt nicht und ich muss Long-Polling verwenden. Wenn ich eine Seite aktualisiere, scheint es für eine Weile zu funktionieren, aber dann passiert die erste Trennung. Ich versuche, automatisch getrennt Ereignis zu verbinden und das folgende Muster:SignalR seltsam Wiederverbindungsmuster

  1. Nachdem die Seite geladen wird, Hub trennt in etwa 110 Sekunden (Standard-Timeout)
  2. Es dauert 3 Disconnected Ereignisse eine Nabe neu starten, nachdem die erste trennen (so dass es nur auf den 4. Versuch verbindet)
  3. Danach wieder verbindet es immer beim ersten Versuch, aber trennt nach etwa 10-15 Sekunden (nicht 110 Sekunden). Es sieht also so aus, als wäre das Keep-Alive-Timeout hier irgendwie in Kraft (während es beim ersten Versuch nicht war).

Dieses Verhalten scheint seltsam. Kann ich etwas tun, um es zu verbessern?

+0

Können Sie das konkretisieren über Ihre Netzwerkbedingungen sein? –

+0

@ BrendanGreen, es ist ein Firmennetzwerk mit einigen Proxy (Webwasher) und eine Menge Dinge blockiert (es ist ein deutsches Firmennetzwerk, wissen Sie ...) – SiberianGuy

+0

@ BrendanGreen, haben Sie die Seite auf http: // www gesehen .asp.net/signager/overview/guide-to-the-api/handling-verbindung-lebensdauer-ereignisse? Das Verbindungsverhalten für SignalR ist 'undefiniert', Sie können viele Verbindungsabbrüche und Wiederverbindungen in einem kurzen Zeitrahmen ohne ersichtlichen Grund beobachten. Die Seite gibt auch Richtlinien, wie man das Verhalten ändert, zB 'GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds (110);' – gd73

Antwort

2

Nehmen Sie die in Understanding and Handling Connection Lifetime Events in SignalR verfügbaren Tipps an, in denen Sie auf Basis des Netzwerkproblems gute Lösungen für die Verbindungslebensdauer verwenden können. Außerdem habe ich in SignalRs Ausgaben die folgende Lösung gefunden, die auch mit Long-Polling funktioniert.

Sie können die KeepAlive Eigenschaft auf den ConfigurationManager und SignalR einen leeren Rahmen von Daten (basierend auf dem Transport) auf dem angegebenen Intervall zu halten um die Verbindung aufrecht (siehe Allow host to specify keep alive times) senden. Der aktuelle Timeout-Mechanismus unterscheidet die Streaming-Protokolle nicht.

+0

Scheint, KeepAlive ist standardmäßig aktiviert – SiberianGuy

+0

@ Idsa Für andere Transporte als lang Polling, sende alle 10 Sekunden ein "Keepalive" -Paket.Dieser Wert darf nicht mehr als 1/3 des Wertes 'DisconnectTimeout' betragen. –

2

Verwenden Sie ConnectionStatusStream. Dieser Stream OnNexts, wenn die clientseitigen SignalR-Hub-Proxy-Ereignisse ausgelöst werden. So sehen wir Dinge wie Verbinden, Verbunden, ConnectionSlow, Reconnecting, Reconnected, Closed, Uninitialized. Alle diese Ereignisse begannen als Ereignisse auf dem SignalR-Hub-Proxy und wurden über eine der vielen RX-Factorys in einen IObservable-Stream umgewandelt. In diesem Fall IObservable.FromEvent.

Wie auch immer, hier ist das gesamte ConnectivityStatusViewModel, das wir verwenden, um die Informationen in der unteren Statusleiste der App anzuzeigen.

Siehe dazu:

ConnectionStatusStream

+0

Ich habe den Code durchgesehen. Obwohl es eine nette Architektur ist (habe nie mit RX gearbeitet), sehe ich nicht, wie es das beschriebene Problem löst – SiberianGuy