2013-08-06 20 views
5

quando è il SignalR Hub OnDisconnected sollevato sul lato server, per il client .NET che si scontrano o chiudere senza chiamare il metodo diStop?Rileva SignalR Hub client Scollegare immediatamente

Sto testando con il client SignalR .NET, non con il client javascript. Se io chiamo la stop metodo sul client, l'hub alzerà OnDisconnected immediatamente metodo.

Ma se chiudo il cliente o uccidere il processo, l'hub alzerà OnDisconnected metodo solo dopo circa 10 secondi.

Come rilevare immediatamente che il client è disconnesso?

+0

Ciao @JasonEvans, grazie per il link. –

risposta

5

Avendo letto la documentazione per SignalR events here, ho notato questa sezione:

Quando una connessione non è attiva, periodicamente il server invia un pacchetto keepalive al client. Alla data di questo articolo è stato scritto , la frequenza di default è ogni 10 secondi

V'è una sezione che spiega come modificare l'impostazione per esempio keepalive

protected void Application_Start(object sender, EventArgs e) 
{ 
    // Make long polling connections wait a maximum of 110 seconds for a 
    // response. When that time expires, trigger a timeout command and 
    // make the client reconnect. 
    GlobalHost.Configuration.ConnectionTimeout = TimeSpan.FromSeconds(110); 

    // Wait a maximum of 30 seconds after a transport connection is lost 
    // before raising the Disconnected event to terminate the SignalR connection. 
    GlobalHost.Configuration.DisconnectTimeout = TimeSpan.FromSeconds(30); 

    // For transports other than long polling, send a keepalive packet every 
    // 10 seconds. 
    // This value must be no more than 1/3 of the DisconnectTimeout value. 
    GlobalHost.Configuration.KeepAlive = TimeSpan.FromSeconds(10); 

    RouteTable.Routes.MapHubs(); 
} 

Così si potrebbe guardare in riduzione di tale valore, al fine di essere avvisato più veloce di quando una connessione client ha andato giù.

+0

Ciao Jason, grazie per le informazioni. Ma dal mio test, KeepAlive influenza solo il tempo del proxy del client Hub per aumentare l'evento StateChanged. Ho già provato a impostare ConnectionTimeout a 6 secondi e KeepAlive a 2 secondi sul lato server, ma non ha alcun effetto sul metodo Hub OnDisconnected. –

+0

Nessun problema, felice di poter aiutare :) –

3

Come rilevare immediatamente che il client è disconnesso?

Non è possibile, a causa del modo in cui TCP funziona, fino a quando non si tenta di inviare dati a tale client. Come spiega la risposta di @JasonEvans, SignalR invia di default i dati (un messaggio "keepalive") ogni dieci secondi.

Problemi correlati