public static async Task ReceiveAsync(this WebSocket ws, IWebSocketHandler handler) { try { while (ws.State == WebSocketState.Open) { var stringResult = new StringBuilder(); WebSocketReceiveResult received; var buffer = new ArraySegment <byte>(new byte[ChunkSize]); var webSocket = ws; do { received = await ws.ReceiveAsync(buffer, CancellationToken.None); switch (received.MessageType) { case WebSocketMessageType.Close: await ws.CloseAsync(WebSocketCloseStatus.NormalClosure, string.Empty, CancellationToken.None); await handler.OnDisconected(webSocket); break; case WebSocketMessageType.Binary: break; case WebSocketMessageType.Text: var data = Encoding.Default.GetString(buffer.Array, buffer.Offset, buffer.Count); stringResult.Append(data.TrimEnd('\0')); break; default: throw new ArgumentOutOfRangeException($"Unknown WebSocket MessageType: {received.MessageType}"); } } while (!received.EndOfMessage); RunInTask(async() => await handler.OnMessage(webSocket, stringResult.ToString())); } } catch (Exception e) { await handler.OnError(e); await handler.OnDisconected(ws); } finally { ws.Dispose(); } }