अद्यतन संपादित करें, कृपया नीचे विकल्प 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 के साथ अपडेट किया गया : अनुरोध के आधार पर ... अन्य समाधान समय पर निर्भर करते हैं, लेकिन आप इसे सीधे कनेक्शन को स्वयं निपटाने के लिए भी मजबूर कर सकते हैं
मैंने सिग्नलआर कोड को खोला, और अंदर आप 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);
}
}
सावधानी, जब यह किया जाता है तो अपने आप को साफ करें।