Ejemplo n.º 1
0
        async Task OnMessage(string[] parts)
        {
            string id      = parts[1];
            Type   type    = Type.GetType(parts[2]);
            var    message = JsonConvert.DeserializeObject(parts[3], type) as IPubSubMessage;

            message.RemoteConnectionId = this.Id;

            try
            {
                await _hub.Publish(message);
                await SendOkResponse(id);
            }
            catch (Exception ex)
            {
                _logger.Debug(ex);
                await SendErrorResponse(id, ex);
            }
        }
Ejemplo n.º 2
0
        void StartNext(string pipeName, Func <NamedPipeServerStream> configure)
        {
            _pendingServer = new PipeServer(_hub, _logger, _onNewPipeSubscriber);

            _pendingServer.Connected += async(s, a) =>
            {
                try
                {
                    lock (_serversLock)
                        _servers = _servers.Add((PipeServer)s);

                    _logger.Info($"Client connected, total count: {_servers.Count}");

                    // start waiting for the next connection
                    StartNext(pipeName, configure);

                    await _hub.Publish(new RemoteClientConnectedEvent()
                    {
                        Timestamp         = DateTime.Now,
                        TotalClientsCount = _servers.Count
                    });
                }
                catch (Exception ex)
                {
                    _logger.Error(ex);
                }
            };

            _pendingServer.Disconnected += async(s, a) =>
            {
                try
                {
                    lock (_serversLock)
                        _servers = _servers.Remove((PipeServer)s);

                    _logger.Info($"Client disconnected, remained: {_servers.Count}");

                    await _hub.Publish(new RemoteClientDisconnectedEvent()
                    {
                        Timestamp         = DateTime.Now,
                        TotalClientsCount = _servers.Count
                    });
                }
                catch (Exception ex)
                {
                    _logger.Error(ex);
                }
            };

            Task.Run(async() =>
            {
                try
                {
                    await _pendingServer.Start(pipeName, configure);
                }
                catch (OperationCanceledException)
                {
                }
                catch (Exception ex)
                {
                    _logger.Error(ex);
                }
            });
        }