using System; using System.Collections.Concurrent; using System.Linq; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; namespace WebSocketManager { public class ConnectionManager { private ConcurrentDictionary _sockets = new ConcurrentDictionary(); public WebSocket GetSocketById(string id) { return _sockets.FirstOrDefault(p => p.Key == id).Value; } public ConcurrentDictionary GetAll() { return _sockets; } public string GetId(WebSocket socket) { return _sockets.FirstOrDefault(p => p.Value == socket).Key; } public void AddSocket(WebSocket socket) { _sockets.TryAdd(CreateConnectionId(), socket); } public async Task RemoveSocket(string id) { WebSocket socket; _sockets.TryRemove(id, out socket); await socket.CloseAsync(closeStatus: WebSocketCloseStatus.NormalClosure, statusDescription: "Closed by the ConnectionManager", cancellationToken: CancellationToken.None); } private string CreateConnectionId() { return Guid.NewGuid().ToString(); } } }