2014-11-30 7 views
7

astratta

Ciao, stavo riflettendo se sia possibile perdere un messaggio con SignalR. Supponiamo che il client si disconnetta ma alla fine si ricolleghi in un breve lasso di tempo, ad esempio 3 secondi. Il cliente riceverà tutti i messaggi che gli sono stati inviati mentre era disconnesso?Does SignalR fornire meccanismi di integrità del messaggio che garantiscono che nessun messaggio si perdono durante la cliente ricollegare

Ad esempio, consideriamo il trasporto LongPolling. Per quanto ne so, il polling lungo è una semplice richiesta http che viene emessa in anticipo dal client per attendere un evento del server.

Non appena si verificano eventi del server, i dati vengono pubblicati sulla richiesta http che porta alla chiusura della connessione sulla richiesta HTTP emessa. Successivamente, il client invia una nuova richiesta http che ripete di nuovo l'intero ciclo.

Il problema

Supponiamo che due eventi accaduti sul server, prima A poi B (quasi immediatamente). Il client riceve il messaggio A che risulta con la chiusura della connessione http. Ora per ottenere il messaggio il client B deve emettere la seconda richiesta http.

Domanda

Se l'evento B avvenuto mentre il client è stato disconnesso dal server e stava cercando di ricollegare.

Il client riceverà automaticamente il messaggio B oppure devo inventare una sorta di meccanismo che garantisca l'integrità del messaggio?

La domanda si applica non solo ai sondaggi prolungati, ma alla situazione generale con la riconnessione del cliente.

P.S. Sto usando SignalR Hub sul lato server.


EDIT:

ho scoperto-out che l'ordine dei messaggi non è garantito, non ero in grado di rendere i messaggi sciolti SignalR

risposta

7

La risposta a questa domanda sta nella il metodo EnqueueOperation qui ...

https://github.com/SignalR/SignalR/blob/master/src/Microsoft.AspNet.SignalR.Core/Transports/TransportDisconnectBase.cs

protected virtual internal Task EnqueueOperation(Func<object, Task> writeAsync, object state) 
{ 
    if (!IsAlive) 
    { 
     return TaskAsyncHelper.Empty; 
    } 

    // Only enqueue new writes if the connection is alive 
    Task writeTask = WriteQueue.Enqueue(writeAsync, state); 
    _lastWriteTask = writeTask; 

    return writeTask; 
} 

Quando il server invia un messaggio a un client, chiama questo metodo. Nell'esempio sopra, il server accoderebbe 2 messaggi da inviare, quindi il client si ricollegherà dopo aver ricevuto il primo, quindi verrà inviato il secondo messaggio.

Se il server mette in coda e invia il primo messaggio e il client si riconnette, c'è una piccola finestra in cui il secondo messaggio potrebbe tentare di essere accodato dove la connessione non è attiva e il messaggio verrebbe eliminato dal server. Quindi, dopo la riconnessione, il client non otterrebbe il secondo messaggio.

Spero che questo aiuti

+0

È legato a un solo polling lungo, o tutti i tipi di trasporti sono interessati? – Lu4

+0

Credo che tutti i trasporti correnti ereditino quella classe base, quindi tutti dovrebbero essere interessati. –

+0

capito, grazie! – Lu4

Problemi correlati