Cập nhật Chỉnh sửa, vui lòng xem Tùy chọn 3 bên dưới. Tất cả những người khác đang dựa vào thời gian chờ, tôi đã đăng một ngắt kết nối bắt buộc.
Nếu bạn đang thử Force Disconnect - bạn có thể lấy danh sách Người dùng được kết nối và gọi ForceLogOut
Hàm ở phía máy chủ, tôi đã thấy điều này ở đâu đó trong dự án mã, tôi hy vọng nó có ích. Nếu bạn chỉ muốn ForceLogout / giết một số người dùng, chỉ cần lặp qua và giết kết nối đó mà thôi.
Phía máy chủ
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();
}
}
}
}
Phía khách hàng
// 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();
});
Được cập nhật với Tùy chọn 3 : dựa trên yêu cầu ... các giải pháp khác dựa vào thời gian chờ, nhưng bạn cũng có thể buộc nó trực tiếp bằng cách tự hủy kết nối
Tôi đã mở mã SignalR và bên trong bạn có thể thấy DisposeAndRemoveAsync
sự chấm dứt thực sự của kết nối máy khách.
1- Bạn có thể sửa đổi hoặc gọi DisposeAndRemoveAsync
với kết nối của bạn.
2- Sau đó gọi 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);
}
}
Chú ý, làm bất kỳ việc làm sạch bản thân khi điều này được thực hiện.