Best Practice für die erneute Verbindung von SignalR 2.0 .NET-Client zu Server-Hub
Ich bin mit SignalR 2.0 mit dem .NET-client in einer mobilen Anwendung, so muss ich zur Behandlung verschiedener Arten von trennt. Manchmal ist die SignalR-client, erneut ohne meine Hilfe und manchmal muss ich erneut anrufen HubConnection.Start() wieder. (da die SignalR auf Magische Weise automatisch die Verbindung wiederherstellt, wenn Sie einige Zeit Frage ich mich, ob ich eine Funktion vermisst oder config-Einstellung)
Was ist der beste Weg, um set-up ein client, der verbindet sich automatisch? Ich habe gesehen, javascript-Beispiele, Griff der Geschlossenen () - Ereignis und dann die Verbindung nach n-Sekunden. Gibt es eine empfohlene Vorgehensweise?
Ich habe gelesen, die Dokumentation und mehrere Artikel über die Lebensdauer von SignalR-verbindungen, aber ich bin immer noch unklar, was mit dem client zu verbinden.
Danke!
InformationsquelleAutor der Frage Ender2050 | 2014-04-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Endlich fand ich dies heraus. Hier ist, was ich gelernt habe, seit diese Frage:
Hintergrund: Wir bauen eine iOS-app mit Xamarin /Monotouch und die .NET SignalR-2.0.3-client. Wir sind mit der Standard-SignalR-Protokolle - und es scheint zu sein, SSE verwenden anstelle von web sockets. Ich bin mir noch nicht sicher, ob es möglich ist der Einsatz von web sockets mit Xamarin /Monotouch. Alles gehostet wird, mithilfe von Azure-websites.
Brauchten wir die app wieder in unseren SignalR server schnell, aber wir hielten uns Probleme, wo die Verbindung nicht verbinden, auf die eigene - oder das verbinden dauerte genau 30 Sekunden (aufgrund einer zugrunde liegenden Protokoll-timeout).
Gab es drei Szenarien landeten wir testen für:
Szenario A - Verbindung das erste mal die app geladen wurde. Dieser funktioniert einwandfrei vom ersten Tag an. Der Verbindungsaufbau abgeschlossen, in weniger als .25 Sekunden auch über 3G-verbindungen. (vorausgesetzt, das radio ist bereits auf)
Szenario B - Wiederverbindung mit den SignalR server nach der app im Leerlauf war/geschlossen für 30 Sekunden. In diesem Szenario, die SignalR-client wird schließlich wieder auf den server auf seine eigene, ohne Besondere Arbeit - aber es scheint zu warten, genau 30 Sekunden, bevor Sie versuchen, erneut zu verbinden. (viel zu langsam für unsere app)
Während dieser 30-Sekunden-Wartezeit, haben wir versucht, den Aufruf HubConnection.Start (), die keinen Effekt hatten. Und ruft HubConnection.Stop() auch dauert 30 Sekunden. Ich fand ein verwandter Fehler auf der SignalR-Website, die erscheint, aufgelöst werdenaber wir sind immer noch mit dem gleichen problem in v2.0.3.
Szenario C - Wiederverbindung mit den SignalR server nach der app im Leerlauf war/geschlossen für 120 Sekunden oder mehr. In diesem Szenario werden die SignalR-transport-Protokoll bereits Zeitüberschreitung, so dass die Kunden nicht automatisch die Verbindung wiederherstellt. Dies erklärt, warum der client manchmal, aber nicht immer wiederherstellen der Verbindung auf seinen eigenen. Die gute Nachricht ist, ruft HubConnection.Start() funktioniert fast sofort wie Szenario A.
So dauerte es eine Weile, um zu realisieren, dass die reconnect-Bedingungen unterschiedlich waren, je nachdem, ob die app geschlossen wurde, für 30 Sekunden vs 120+ Sekunden. Und obwohl die SignalR-tracing-Protokolle beleuchten, was Los ist mit das zugrunde liegende Protokoll, ich don 'T glaube, es' s ein Weg zur Abwicklung der transport-level-Ereignisse im code. (die Geschlossene() Ereignis wird ausgelöst, nachdem 30 Sekunden in Szenario B, der sofort in Szenario C, die State-Eigenschaft sagt "Verbunden" während dieser reconnect-Wartezeit; keine andere relevante Ereignisse oder Methoden)
Lösung:
Die Lösung liegt auf der Hand. Wir warten nicht, für SignalR, um seine Wiederverbindung Magie. Stattdessen wird, wenn die app aktiviert ist oder wenn das Telefon die Netzwerk-Verbindung wieder hergestellt ist, sind wir einfach Reinigung der Veranstaltungen und de-Referenzierung der HubConnection (nicht entsorgen, weil es dauert 30 Sekunden, hoffentlich garbage collection wird sich darum kümmern) und eine neue Instanz zu erstellen. Jetzt funktioniert alles Super. Aus irgendeinem Grund, ich dachte, wir sollten die Wiederverwendung einer permanenten Verbindung und Wiederverbinden, statt nur eine neue Instanz zu erstellen.
InformationsquelleAutor der Antwort Ender2050
Einstellung ein-timer auf die getrennt-event zu versuchen automatisch verbinden ist die einzige Methode, die ich mir bewusst bin.
In javascript ist es getan, wie also:
Dies ist die empfohlene Vorgehensweise bei der Dokumentation:
InformationsquelleAutor der Antwort KingOfHypocrites
Seit der OP Fragen, für eine .NET-client (eine winform-Implementierung unten),
InformationsquelleAutor der Antwort ibubi
Könnten Sie versuchen, sich zum aufrufen von server-Methode von Ihrem android, bevor Sie wieder anschließen Landes starten, um zu verhindern, dass Magie reconnect-problem.
SignalR-Hub C#
In Android
InformationsquelleAutor der Antwort Jongz Puangput