อัปเดตการแก้ไขแล้วโปรดดูตัวเลือก 3ด้านล่าง คนอื่น ๆ ทั้งหมดพึ่งพาการหมดเวลาฉันโพสต์การยกเลิกการเชื่อมต่อแบบบังคับ
หากคุณกำลังพยายามยกเลิกการเชื่อมต่อ - คุณสามารถรับรายชื่อผู้ใช้ที่เชื่อมต่อและโทร ForceLogOut
ฟังก์ชั่นทางฝั่งเซิร์ฟเวอร์ฉันเห็นสิ่งนี้ในโปรเจคโค้ดฉันหวังว่ามันจะช่วยได้ หากคุณต้องการบังคับให้ออกจากระบบ / ฆ่าผู้ใช้บางคนเพียงแค่วนซ้ำและทำลายการเชื่อมต่อนั้นเท่านั้น
ฝั่งเซิร์ฟเวอร์
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();
}
}
}
}
ด้านลูกค้า
// 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();
});
อัปเดตด้วยตัวเลือก 3 : ตามคำขอ ... โซลูชันอื่น ๆ พึ่งพาการหมดเวลา แต่คุณสามารถบังคับได้โดยตรงด้วยการกำจัดการเชื่อมต่อด้วยตนเอง
ฉันเปิดรหัส SignalR ขึ้นมาและข้างในคุณสามารถเห็นDisposeAndRemoveAsync
การยุติการเชื่อมต่อลูกค้าที่แท้จริง
1- คุณสามารถปรับเปลี่ยนหรือโทรDisposeAndRemoveAsync
ด้วยการเชื่อมต่อของคุณ
2- จากนั้นโทร 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);
}
}
ข้อควรระวังให้ทำความสะอาดตัวเองเมื่อเสร็จสิ้น