private async Task ProcessWSChat(AspNetWebSocketContext context) { // получаем класс, для работы с сокетом WebSocket socket = context.WebSocket; // добавляем в список присоединённых клиентов clients.Add(socket); bool isEnabled = true; while (isEnabled) { ArraySegment buffer = new ArraySegment(new byte[1024]); // ожидаем сообщения WebSocketReceiveResult result = await socket.ReceiveAsync(buffer, CancellationToken.None); // если получено сообщение на закрытие канала if (result.MessageType == WebSocketMessageType.Close) { // меняем флаг, для завершения цикла isEnabled = false; // удаляем сокет из списка подключенных клиентов clients.Remove(socket); } // иначе получены данные else { // формируем текст сообщения string userMessage = string.Format("You sent: {0} at {1:mm:ss.fff}", Encoding.UTF8.GetString(buffer.Array, 0, result.Count), DateTime.Now); byte[] messageBytes = Encoding.UTF8.GetBytes(userMessage); buffer = new ArraySegment(messageBytes); // отправляем всем активным клиентам Parallel.ForEach(clients, p => { if (p.State == WebSocketState.Open) { p.SendAsync(buffer, WebSocketMessageType.Text, true, CancellationToken.None); } }); } } }