Eine ziemlich einfache Möglichkeit, dies zu handhaben, wäre, jeder Nachricht eine ID zuzuweisen, die mit jeder Nachricht zunimmt. Der Client muss die letzte Nachricht, die er erhalten hat, im Auge behalten und beim erneuten Verbinden diese Nachrichten-ID an den Server senden. und der Server müsste dann alle verpassten Nachrichten an den Client senden. Sollte relativ einfach zu implementieren sein.
EDIT: Ich glaube nicht, dass Sie wirklich auf dem Server einen echten Zustand beibehalten müssten - ich denke, fast alles davon könnte in Ihren Datenspeicher oder auf Ihren Client geschoben werden. Der Kunde würde die ID oder Zeitstempel der letzten Nachricht senden, die er erhalten hatte:
$.connection.myHub.server.updateMe(lastMessageId);
Sie würden eine Art von Trägerdatenspeichern wollen - so, wenn der Server empfängt die Nachricht updateMe()
, wäre es ein tun Abfrage auf der Datenbank und ziehen Sie alle Zeilen mit einer ID größer als die, die es gerade erhalten hat. Es würde diese als Teil des Rückgabewerts seiner UpdateMe()
-Methode an den Client zurückgeben. Und dann würde es versuchen, neue Nachrichten zu liefern, die auf die gleiche Weise kommen, wie es normalerweise der Fall wäre, indem Methoden auf dem Client aufgerufen werden.
Wie Staatenlosigkeit ein Ziel von SignalR ist: Ich kann das nicht kommentieren, außer zu beobachten, dass ich mir keine vernünftig komplexe reale Anwendung vorstellen kann, die keine Art von Backing-Datastore hätte. Ob es sich um SignalR oder ein anderes Framework (WCF, XSockets usw.) handelt, macht wenig Unterschied.
Wenn Sie für 100% garantierte Lieferung suchen, ist SignalR kein guter Kandidat für Ihre Lösung. Sie benötigen ein robustes Warteschlangensystem. – EkoostikMartin
Sie sollten RabbitMQ (http://www.rabbitmq.com/) betrachten.Sie können Nachrichten in der Warteschlange für jeden Client in eine Warteschlange stellen, auch wenn der Client nicht dazu in der Lage ist, Nachrichten daraus abzurufen. – rpgmaker
+1 EkoostikMartin. Wenn Sie nach zuverlässigem Messaging suchen, müssen Sie zusätzlich zur Verwendung von SignalR eine Schicht erstellen. – davidfowl