private async Task <ClientWebSocketReceiver> TryConnectAsync(CancellationToken cancellationToken) { _webSocket = new ClientWebSocket(); _webSocket.Options.SetRequestHeader(NCSConstants.ConnectorName, InvocatorContext.ConnectorName); try { await _webSocket.ConnectAsync(InvocatorContext.Uri, cancellationToken); } catch (Exception ex) { ProxyLogHelper.Log(_loggerFactory, InvocatorContext, "Error", ex); return(null); } var receiverContext = new ClientWebSocketReceiverContext { Compressor = _compressor, InvocatorContext = InvocatorContext, LoggerFactory = _loggerFactory, WebSocket = _webSocket }; var receiver = new ClientWebSocketReceiver(_serviceProvider, receiverContext, Close, (connectionId) => { _connectionId = connectionId; }); return(receiver); }
public async Task ConnectAsync(CancellationToken cancellationToken) { ClientWebSocketReceiver receiver = null; while (!cancellationToken.IsCancellationRequested) { _logger.LogInformation("===TryConnectAsync to: {0}", InvocatorContext.Uri.ToString()); receiver = await TryConnectAsync(cancellationToken); if (receiver != null && WebSocketState == WebSocketState.Open) { break; } _logger.LogInformation("===Retry..."); await Task.Delay(1000); } _logger.LogInformation("===WebSocketConnected to: {0}", InvocatorContext.Uri.ToString()); if (InvocatorContext.OnConnectedAsync != null) { await InvocatorContext.OnConnectedAsync(_webSocket); } await Task.WhenAll(receiver.ReceiveAsync(cancellationToken)); // Disconnected if (_webSocket.CloseStatus.HasValue || _webSocket.State == WebSocketState.Aborted) { if (InvocatorContext.OnDisconnectedAsync != null) { await InvocatorContext.OnDisconnectedAsync(_webSocket); } else { await ConnectAsync(cancellationToken); } } }