SignalR: ¿método del lado del servidor para detectar si un cliente se desconecta de un concentrador?
-
21-12-2019 - |
Pregunta
Estoy queriendo detener un System.Timers.Timer
que se ejecuta en un concentrador de SignalR después de que un cliente cierra una ventana/pestaña que contiene la conexión activa.
Intenté enviar un valor bool al servidor llamando al código del servidor para notificar al servidor que el cliente todavía está conectado o no, pero actualmente no está funcionando.
window.onbeforeunload = function () {
profile.server.setIsConnected(false);
};
Lado del servidor:
public ProfileHub()
{
timer = new Timer(15000);
timer.Elapsed += (sender, e) => { timer_Elapsed(sender, e, _isActive); };
timer.AutoReset = false;
}
[Authorize]
private void timer_Elapsed(object sender, ElapsedEventArgs e, bool active)
{
timer.Stop();
if (active)
{
System.Diagnostics.Debug.WriteLine("Timer Started");
timer.Start();
}
else
{
System.Diagnostics.Debug.WriteLine("Timer Stopped");
return;
}
// process code
}
[Authorize]
public void SetIsActive(bool isActive)
{
_isActive = isActive;
}
¿Es esto posible y estoy en el camino correcto?Sospecho que tiene algo que ver con el delegado anónimo de timer.Elapsed
, pero no estoy del todo seguro.
Solución
SignalR tiene OnConnected, OnDisconnected y OnReconnected que se llaman cada vez que el cliente realiza una de esas acciones.Simplemente puedes anularlos:
public override Task OnConnected()
{
return base.OnConnected();
}
public override Task OnDisconnected()
{
//custom logic here
return base.OnDisconnected();
}
public override Task OnReconnected()
{
return base.OnReconnected();
}
He descubierto que son extremadamente útiles también para fines de depuración.Si desea configurar un temporizador para cada persona, debe utilizar algún tipo de mapeo de conexión junto con las funciones anteriores para realizar un seguimiento de sus usuarios.
Otros consejos
Deberías usar el método OnDisconnected
en lugar del cronómetro. Aquí está la documentación oficial, pero el marco le brinda eventos cuando un cliente conectado se desconecta o se vuelve a conectar.