Пример #1
0
        private async Task TryConnectAsync(CancellationTokenSource cancellationTokenSource = null)
        {
            var invocatorContext = CreateInvocatorContext();
            var uri = new Uri($"ws://{invocatorContext.HostAddress}");

            _webSocket = new ClientWebSocket();
            _webSocket.Options.SetRequestHeader(SocketsConstants.ConnectorName, invocatorContext.ConnectorName);
            try
            {
                CancellationToken token = cancellationTokenSource != null ? cancellationTokenSource.Token : CancellationToken.None;
                await _webSocket.ConnectAsync(uri, token);
            }
            catch (Exception ex)
            {
                ProxyLogHelper.Log(_loggerFactory, invocatorContext, "Error", ex);
                return;
            }

            var receiverContext = new WebSocketReceiverContext
            {
                Compressor       = _compressor,
                InvocatorContext = invocatorContext,
                LoggerFactory    = _loggerFactory,
                WebSocket        = _webSocket
            };
            var receiver = new WebSocketReceiver(_serviceProvider, receiverContext, Close, (connectionId) => {
                _connectionId = connectionId;
            });
            await receiver.ReceiveAsync();
        }
Пример #2
0
        public async Task ConnectAsync(WebSocket webSocket, string connectionId, string connectorName = "")
        {
            var receiverContext = new WebSocketReceiverContext
            {
                Compressor    = _compressor,
                ConnectionId  = connectionId,
                LoggerFactory = _loggerFactory,
                WebSocket     = webSocket
            };

            WebSocketTransport transport = null;

            if (Connections.TryGetValue(connectionId, out transport))
            {
                transport.ReConnect(webSocket);
                List <MessageHolder> messages = _lifetimeManager.TryDequeue(connectionId);
                foreach (var message in messages)
                {
                    await SendAsync(transport, new WebSocketMessageDescriptor
                    {
                        MessageType  = WebSocketMessageType.Text,
                        Segments     = message.Segments,
                        EndOfMessage = true,
                        IsQueue      = true,
                    });
                }
            }
            else
            {
                transport = new WebSocketTransport(webSocket, connectionId, connectorName);
                var context = new WebSocketMessageContext();
                context.Command = WebSocketCommands.Handshake;
                context.Value   = connectionId;
                context.Header  = await _initState.GetStateAsync();

                Connections.TryAdd(connectionId, transport);

                await SendAsync(connectionId, context);
            }

            var receiver = new WebSocketReceiver(_serviceProvider, receiverContext, CloseConnection);
            await receiver.ReceiveAsync();
        }
Пример #3
0
        public async Task ConnectAsync(WebSocket webSocket,
                                       string connectionId,
                                       string connectorName = "",
                                       CancellationToken cancellationToken = default(CancellationToken))
        {
            if (cancellationToken != CancellationToken.None)
            {
                cancellationToken.Register(() =>
                {
                    CancellationGraceful();
                });
            }

            var receiverContext = new WebSocketReceiverContext
            {
                Compressor       = _compressor,
                ConnectionId     = connectionId,
                LoggerFactory    = _loggerFactory,
                WebSocket        = webSocket,
                InvocatorContext = InvocatorContext
            };

            if (Connections.TryGetValue(connectionId, out WebSocketTransport transport))
            {
                transport.ReConnect(webSocket);
            }
            else
            {
                transport = new WebSocketTransport(webSocket, connectionId, connectorName);
                var context = new WebSocketMessageContext();
                context.Command = WebSocketCommands.Handshake;
                context.Value   = connectionId;
                context.Header  = await _initState.GetStateAsync();

                Connections.TryAdd(connectionId, transport);

                await SendAsync(connectionId, context);
            }

            var receiver = new WebSocketReceiver(_serviceProvider, receiverContext, CloseConnection, _loggerFactory);
            await receiver.ReceiveAsync(cancellationToken);
        }