Edit yang Diperbarui, silakan lihat Opsi 3 di bawah ini. Semua yang lain mengandalkan batas waktu, saya diposting putuskan paksa.
Jika Anda mencoba Memutus Kekuatan - Anda bisa mendapatkan daftar Pengguna yang Terhubung dan memanggil ForceLogOut
Fungsi di sisi server, saya melihat ini di suatu tempat di proyek kode, saya harap ini membantu. Jika Anda hanya ingin memaksaLogout / membunuh beberapa pengguna, cukup lewati saja dan matikan koneksi itu saja.
Sisi server
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();
}
}
}
}
Sisi klien
// 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();
});
Diperbarui dengan Opsi 3 : berdasarkan permintaan ... solusi lain bergantung pada waktu habis, tetapi Anda juga dapat memaksanya secara langsung dengan membuang koneksi sendiri
Saya membuka kode SignalR, dan di dalam Anda dapat melihat DisposeAndRemoveAsync
penghentian koneksi klien yang sebenarnya.
1- Anda dapat memodifikasi atau menelepon DisposeAndRemoveAsync
dengan koneksi Anda.
2- Lalu panggil 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);
}
}
Perhatian, lakukan pembersihan sendiri saat ini dilakukan.