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
public class User
{
public string Name { get; set; }
public HashSet<string> ConnectionIds { get; set; }
}
public class ExtendedHub : Hub
{
private static readonly ConcurrentDictionary<string, User> ActiveUsers =
new ConcurrentDictionary<string, User>(StringComparer.InvariantCultureIgnoreCase);
public IEnumerable<string> GetConnectedUsers()
{
return ActiveUsers.Where(x => {
lock (x.Value.ConnectionIds)
{
return !x.Value.ConnectionIds.Contains
(Context.ConnectionId, StringComparer.InvariantCultureIgnoreCase);
}
}).Select(x => x.Key);
}
public void forceLogOut(string to)
{
User receiver;
if (ActiveUsers.TryGetValue(to, out receiver))
{
IEnumerable<string> allReceivers;
lock (receiver.ConnectionIds)
{
allReceivers = receiver.ConnectionIds.Concat(receiver.ConnectionIds);
}
foreach (var cid in allReceivers)
{
// ***************** log out/KILL connection for whom ever your want here
Clients.Client(cid).Signout();
}
}
}
}
Côté client
// 1- Save your connection variable when you start it, and later on you can use it to stop.
var myHubProxy = $.connection.myHub
// 2- Use it when you need to stop it, IF NOT YOU WILL GET AN ERROR
myHubProxy.client.stopClient = function() {
$.connection.hub.stop();
};
// With a button for testing
$('#SomeButtonKillSignalr').click(function () {
$.connection.hub.stop();
});
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);
public async Task DisposeAndRemoveAsync(HttpConnectionContext connection)
{
try
{
// this will force it
await connection.DisposeAsync();
}
catch (IOException ex)
{
_logger.ConnectionReset(connection.ConnectionId, ex);
}
catch (WebSocketException ex) when (ex.InnerException is IOException)
{
_logger.ConnectionReset(connection.ConnectionId, ex);
}
catch (Exception ex)
{
_logger.FailedDispose(connection.ConnectionId, ex);
}
finally
{
// Remove it from the list after disposal so that's it's easy to see
// connections that might be in a hung state via the connections list
RemoveConnection(connection.ConnectionId);
}
}
Attention, nettoyez vous-même lorsque cela est fait.