2013-02-18 11 views
7

Sto utilizzando SignalR nella mia app. Ho un'applicazione che dipende molto dal fatto che OnDisconnected() viene chiamato correttamente. E si chiama correttamente nelle seguenti circostanze:Disconnessione del segnale non chiamata sulla disconnessione/ricollegamento di Internet

public Task OnDisconnected() 
{ 
    try 
    { 
     DeleteUser(Context.ConnectionId); 
     return null; 
    } 
    catch (Exception ex) 
    { 
     return null; 
    } 
} 
  1. L'utente aggiorna la pagina
  2. L'utente passa a una nuova pagina
  3. L'utente chiude il browser

Tuttavia, non viene chiamato se la connessione di rete diminuisce improvvisamente. Ad esempio, se scollego il cavo di rete sul computer client o disattivo la rete wireless del client o scollego il router, OnDisconnected() non verrà mai chiamato, anche dopo diversi minuti di attesa.

+0

Non ho lavorato molto con SignalR, ma sono abbastanza sicuro che non è una delle sue funzionalità controllare, se l'utente è ancora connesso a un hub. Si consiglia di implementare il proprio timer che registrerà l'utente dopo (x) minuti. – Timsen

+0

Basta collegare questo link, potrebbe essere utile per te: http://www.dotnetcurry.com/ShowArticle.aspx?ID=826 – Timsen

risposta

6

Si alza disconnesso ma non immediatamente. È configurabile una soglia (30 secondi in base all'impostazione predefinita) che SignalR attenderà (dopo che la connessione TCP sottostante è scomparsa e anche questa non è immediata) prima che consideri disconnesso un client. Se la connessione si interrompe e si riconnette prima del timeout configurato, allora non genererà OnDisconnected.

Se non lo vedi mai essere sollevato in qualche scenario dopo aver atteso un po ', potrebbe essere un bug. SignalR 1.0 è stato rilasciato oggi, quindi ti incoraggio a provare anche questo e vedere se vedi ancora il problema.

+0

Ok grazie dfowler..i userà il segnale r 1.0, ora sto usando il segnale r 0.5.3 – user1527989

+1

David, è 'HttpContext.Response.ClientDisconnectedToken' onorato quando stiamo ospitando SignalR sotto ASP.NET 4.5 + IIS 8.0? – tugberk

+2

Non lo usiamo perché c'è un bug in esso. Ma quando sarà risolto lo useremo. – davidfowl

2

questo non può essere la risposta giusta, ma questo è quello che so:

Non sarà in grado di vedere l'evento OnDisconnected sparato improvvisamente quando il collegamento è caduto perché SignalR non tiene il basso (si pool per la connessione con un'attività in background per vedere se la connessione è morta entro un determinato intervallo). Quando chiudi il browser, suppongo che SignalR invii una richiesta al server per segnalare l'evento di disconnessione. Ecco perché improvvisamente vedi sparare l'evento.

Tuttavia, ASP.NET 4.5 ha una proprietà CancellationToken denominata ClientDisconnectedToken per HttpContext.Response che viene segnalata quando viene interrotta la connessione TCP. Funziona solo con IIS 8.0 per quanto ne so e non sono sicuro che SignalR funzioni con questo host .NET ASP.NET 4.5.

Problemi correlati