Un modo abbastanza semplice per gestire ciò sarebbe assegnare a ciascun messaggio un ID che si incrementa con ciascun messaggio. Il client avrebbe bisogno di tenere traccia dell'ultimo messaggio che aveva ricevuto e, al momento della riconnessione, avrebbe solo inviato quell'ID messaggio al server; e il server dovrebbe quindi inviare tutti i messaggi persi al client. Dovrebbe essere ragionevolmente semplice da implementare.
MODIFICA: Non credo che dovresti mantenere uno stato reale sul server vero e proprio - penso che quasi tutto potrebbe essere trasferito al tuo datastore o al tuo cliente. Il client invia l'ID o il timestamp dell'ultimo messaggio che aveva ricevuto:
$.connection.myHub.server.updateMe(lastMessageId);
Che ci si vuole una sorta di supporto datastore - in modo che quando il server riceve il messaggio updateMe()
, si farebbe una interrogare sul database ed estrarre tutte le righe con un ID maggiore di quello appena ricevuto. Restituirebbe quelli al client come parte del valore restituito del suo metodo UpdateMe()
. E poi proverebbe a consegnare tutti i nuovi messaggi che arrivano nello stesso modo in cui lo farebbe normalmente, chiamando metodi sul client.
Per quanto riguarda l'apolidia come obiettivo di SignalR: non posso commentare al riguardo, al di là di osservare che non riesco a immaginare un'applicazione del mondo reale ragionevolmente complessa che non avrebbe bisogno di avere una sorta di datastore di supporto, che si tratti di SignalR o di qualche altro framework (WCF, XSockets, ecc.) fa poca differenza.
fonte
2012-12-28 07:01:36
Se siete alla ricerca di consegna garantita al 100%, SignalR non è un buon candidato per la soluzione. Hai bisogno di un sistema di accodamento robusto. – EkoostikMartin
Si dovrebbe considerare RabbitMQ (http://www.rabbitmq.com/).È possibile mettere in coda i messaggi in coda per ciascun client anche se il client non è disponibile per estrarre messaggi da esso. – rpgmaker
+1 EkoostikMartin. Se stai cercando un servizio di messaggistica affidabile, è necessario aggiungerlo sopra usando SignalR. – davidfowl