private async Task InternalReceiveAsync() { var buffer = new byte[SocketsConstants.ChunkSize]; var result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); while (!result.CloseStatus.HasValue) { if (result.MessageType == WebSocketMessageType.Text) { try { var context = result.ToContext(buffer); if (context.Command == WebSocketCommands.Handshake) { _context.ConnectionId = context.Value?.ToString(); _handshakeCallback?.Invoke(_context.ConnectionId); } var invocator = _context.GetInvocator(_serviceProvider); invocator?.InvokeAsync(context); } catch (Exception ex) { LogHelper.Log(_context, "Error", ex); } result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } if (result.MessageType == WebSocketMessageType.Binary) { byte[] binaryResult = null; using (var ms = new MemoryStream()) { while (!result.EndOfMessage) { if (!result.CloseStatus.HasValue) { await ms.WriteAsync(buffer, 0, result.Count); } result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } if (result.EndOfMessage) { if (!result.CloseStatus.HasValue) { await ms.WriteAsync(buffer, 0, result.Count); } } binaryResult = ms.ToArray(); } try { var context = await result.ToBinaryContextAsync(_context.Compressor, binaryResult); var invocator = _context.GetInvocator(_serviceProvider); invocator?.InvokeAsync(context); } catch (Exception ex) { LogHelper.Log(_context, "Error", ex); } result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), CancellationToken.None); } } await _context.WebSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); _closeCallback.Invoke(_context); }
public async Task ReceiveAsync(CancellationToken cancellationToken) { var buffer = new byte[NCSConstants.ChunkSize]; var result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken); while (!result.CloseStatus.HasValue) { if (result.MessageType == WebSocketMessageType.Text) { byte[] inputs = null; using (var ms = new MemoryStream()) { while (!result.EndOfMessage) { await ms.WriteAsync(buffer, 0, result.Count); result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken); } await ms.WriteAsync(buffer, 0, result.Count); inputs = ms.ToArray(); } try { var context = result.ToContext(inputs); var invocator = _context.GetInvocator(_serviceProvider); if (invocator != null) { await invocator.InvokeAsync(context); } } catch (Exception ex) { LogHelper.Log(_context, "Error", ex); } result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken); } if (result.MessageType == WebSocketMessageType.Binary) { byte[] binaryResult = null; using (var ms = new MemoryStream()) { while (!result.EndOfMessage) { await ms.WriteAsync(buffer, 0, result.Count); result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken); } await ms.WriteAsync(buffer, 0, result.Count); binaryResult = ms.ToArray(); } try { var context = await result.ToBinaryContextAsync(_context.Compressor, binaryResult); var invocator = _context.GetInvocator(_serviceProvider); if (invocator != null) { await invocator.InvokeAsync(context); } } catch (Exception ex) { LogHelper.Log(_context, "Error", ex); } result = await _context.WebSocket.ReceiveAsync(new ArraySegment <byte>(buffer), cancellationToken); } } await _context.WebSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, cancellationToken); _logger.LogInformation("WebSocketReceiver[Server] {0} has close status for connection: {1}", result.CloseStatus, _context.ConnectionId); _closeCallback?.Invoke(_context); }