SignalR: ¿método del lado del servidor para detectar si un cliente se desconecta de un concentrador?

StackOverflow https://stackoverflow.com//questions/23021457

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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top