async Task HandleWebSocketSession(IWebSocketSession session) { sessions[session.Id] = session; try { using (session) { BroadcastMessage(string.Format("*** session-{0} connected ({1} online)", session.Id, sessions.Count)); while (session.IsOpen) { var message = await session.ReadNextMessageAsync().ConfigureAwait(false); switch (message.MessageType) { case WebSocketMessage.Type.Text: var text = (WebSocketMessage.Text)message; BroadcastMessage(string.Format("<session-{0}> {1}", session.Id, text.Payload)); break; case WebSocketMessage.Type.Close: session.CloseSession(); break; case WebSocketMessage.Type.Ping: session.SendPong(); break; case WebSocketMessage.Type.Pong: break; } } } } finally { sessions.TryRemove(session.Id, out session); BroadcastMessage(string.Format("*** session-{0} disconnected", session.Id)); } }