SignalR - Méthode côté serveur pour détecter si un client se déconnecte d'un hub ?
-
21-12-2019 - |
Question
Je veux arrêter un System.Timers.Timer
qui s'exécute dans un hub SignalR après qu'un client ferme une fenêtre/un onglet contenant la connexion active.
J'ai essayé d'envoyer une valeur booléenne au serveur en appelant le code du serveur pour informer le serveur que le client est toujours connecté ou non, mais cela ne fonctionne pas actuellement.
window.onbeforeunload = function () {
profile.server.setIsConnected(false);
};
Du côté serveur:
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;
}
Est-ce possible et suis-je sur la bonne voie ?Je soupçonne que cela a quelque chose à voir avec le délégué anonyme de timer.Elapsed
, mais je n'en suis pas entièrement sûr.
La solution
SignalR a OnConnected, OnDisconnected et OnReconnected qui sont appelés chaque fois que le client effectue l'une de ces actions.Vous pouvez simplement les remplacer :
public override Task OnConnected()
{
return base.OnConnected();
}
public override Task OnDisconnected()
{
//custom logic here
return base.OnDisconnected();
}
public override Task OnReconnected()
{
return base.OnReconnected();
}
Je les ai trouvés extrêmement utiles également à des fins de débogage.Si vous souhaitez définir une minuterie pour chaque personne, vous devez utiliser une sorte de connectionMapping avec les fonctions ci-dessus pour suivre vos utilisateurs.
Autres conseils
Vous devriez utiliser la méthode OnDisconnected
au lieu de la minuterie. Voici la documentation officielle, mais le framework vous donne des événements lorsqu'un client connecté se déconnecte ou se reconnecte.