private async Task Receive(WebSocket socket, ReproWebSocketHandler handler, CancellationToken contextRequestAborted) //, Action<WebSocketReceiveResult, string> handleMessage) { while (socket.State == WebSocketState.Open) { string serializedMessage = null; WebSocketReceiveResult result = null; byte[] bytes = ArrayPool <byte> .Shared.Rent(16 * 1024); try { var buffer = new ArraySegment <byte>(bytes); using MemoryStream ms = new MemoryStream(); do { try { result = await socket.ReceiveAsync(buffer, contextRequestAborted).ConfigureAwait(false); } catch (OperationCanceledException e) { _logger.LogWarning(e, "Request aborted"); return; } ms.Write(buffer.Array, buffer.Offset, result.Count); } while (!result.EndOfMessage); ms.Seek(0, SeekOrigin.Begin); using var reader = new StreamReader(ms, Encoding.UTF8); serializedMessage = await reader.ReadToEndAsync().ConfigureAwait(false); } finally { ArrayPool <byte> .Shared.Return(bytes); } var acitvity = new Activity("Test"); acitvity.Start(); Console.WriteLine("Activity: {0}", acitvity.Id); await handler.HandleAsync(serializedMessage); acitvity.Stop(); } }
public async Task Invoke(HttpContext context, ReproWebSocketHandler handler) { try { if (!context.WebSockets.IsWebSocketRequest) { await _next.Invoke(context); return; } WebSocket socket = await context.WebSockets.AcceptWebSocketAsync().ConfigureAwait(false); await Receive(socket, handler, context.RequestAborted); } catch (Exception ex) { _logger.LogError(ex, ex.Message); } }