Aktualisierte Bearbeitung, siehe Option 3 unten. Alle anderen verlassen sich auf Timeout, ich habe eine erzwungene Trennung gepostet.
Wenn Sie versuchen, eine Verbindung zu erzwingen, können Sie die Liste der verbundenen Benutzer abrufen und die ForceLogOut
Funktion auf der Serverseite aufrufen. Ich habe dies irgendwo im Codeprojekt gesehen. Ich hoffe, es hilft. Wenn Sie nur einige der Benutzer erzwingen / beenden möchten, durchlaufen Sie einfach diese Verbindung und beenden Sie sie nur.
Serverseite
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();
}
}
}
}
Client-Seite
// 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();
});
Aktualisiert mit Option 3 : basierend auf Anfrage ... die anderen Lösungen basieren auf einer Zeitüberschreitung, aber Sie können sie auch direkt erzwingen, indem Sie die Verbindung selbst trennen
Ich habe den SignalR-Code geöffnet und darin können Sie DisposeAndRemoveAsync
die tatsächliche Beendigung einer Client-Verbindung sehen.
1- Sie können DisposeAndRemoveAsync
Ihre Verbindung ändern oder anrufen .
2- Dann anrufen 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);
}
}
Achtung, räumen Sie selbst auf, wenn dies erledigt ist.