/// <summary> /// Reads the complete next text message from the websocket /// </summary> /// <returns>The text message, or null if socket was closed</returns> private async Task <string> ReceiveNextMessageAsync(IClientWebSocketProxy ws) { _receiveStream.Position = 0; WebSocketReceiveResult result; do { result = await ws.ReceiveAsync(new ArraySegment <byte>(_readBuffer), _cancellationToken.Token); if (result == null || result.Count == 0 || result.MessageType == WebSocketMessageType.Close) { return(null); } if (ws.CloseStatus.HasValue) { return(null); } Debug.Assert(result.MessageType == WebSocketMessageType.Text); if (result.EndOfMessage && _receiveStream.Position == 0) { return(Encoding.UTF8.GetString(_readBuffer, 0, result.Count)); // No need to use memory stream } _receiveStream.Write(_readBuffer, 0, result.Count); }while (!result.EndOfMessage); return(Encoding.UTF8.GetString(_receiveStream.GetBuffer(), 0, (int)_receiveStream.Position)); }