Comme vous pouvez le voir dans cette documentation Microsoft sur les paramètres Timeout et Keepalive, vous pouvez définir DisconnectTimeout dans les options.
Exemple:
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();
}
Edit : Puisque vous voulez couper la connexion du client quoi CancellationToken
qu'il arrive , vous parlez d'un comportement mais malheureusement cela n'est toujours pas pris en charge dans SignalR comme vous pouvez le voir ici et ici , l'équipe veut le faire pour SignalR
mais il y a toujours aucune nouvelle à ce sujet.
Veuillez lire ce document Microsoft sur l'événement de durée de vie du concentrateur. Vous pouvez modifier les valeurs par défaut de ces paramètres, les définir
Application_Start
dans votreGlobal.asax
fichier. Mais de cette façon, vous ne pouvez pas contrôler complètement le côté client. Donc, vous utilisez lasetTimeout
fonction javascript et passez la fin du serveur de formulaire de temps quand un nouvel utilisateur connect.it peut êtreGlobalHost.Configuration.DisconnectTimeout
ou quand vous le souhaitez. Je donne un exemple complet avec un projet de démonstration. En fait, j'utilise cette logique dans un très grand système de billetterie pour la détention de ticket en temps réel. (veuillez lire tous les commentaires en ligne)Modèle:
Centre:
TestView:
hub.js:
(Testé)
la source
Vous devez définir un délai d'expiration. Sur le serveur, vous pouvez définir DisconnectTimeout, comme ceci:
https://zzz.buzz/2016/05/11/setting-timeout-for-signalr-for-easier-debugging/
la source
Modification mise à jour, veuillez consulter l' option 3 ci-dessous. Tous les autres comptent sur le timeout, j'ai posté une déconnexion forcée.
Si vous essayez de forcer la déconnexion - vous pouvez obtenir la liste des utilisateurs connectés et appeler la
ForceLogOut
fonction côté serveur, j'ai vu cela quelque part sur le projet de code, j'espère que cela aide. Si vous souhaitez uniquement forcer la déconnexion / tuer certains utilisateurs, il suffit de parcourir et de tuer uniquement cette connexion.Du côté serveur
Côté client
Mise à jour avec l'option 3 : sur demande ... les autres solutions reposent sur le time out, mais vous pouvez également le forcer directement en supprimant la connexion vous-même
J'ai ouvert le code SignalR et à l'intérieur, vous pouvez voir
DisposeAndRemoveAsync
la fin réelle d'une connexion client.1- Vous pouvez modifier ou appeler
DisposeAndRemoveAsync
avec votre connexion.2- Appelez ensuite
RemoveConnection(connection.ConnectionId);
Attention, nettoyez vous-même lorsque cela est fait.
la source
$.connection.hub.stop()
fonction renvoie une erreur car la demande n'a pas été entièrement envoyée au backend. Je recherche donc une solution qui tue la connexion actuellement active même s'il y a une demande en cours.