コード例 #1
0
        private async Task <bool> HttpNegotiation(WebSocketHttpRequest request, WebSocketHttpResponse response)
        {
            await Task.Delay(TimeSpan.FromMilliseconds(1));

            var connectionId = Guid.Empty;

            if (request.RequestUri == null || request.RequestUri.OriginalString.Length < 1 ||
                !Guid.TryParse(request.RequestUri.OriginalString.Substring(1), out connectionId))
            {
                connectionId = _sysInfo.Guid();
                _log.Info("Connection Id created: {0}", connectionId);
            }
            else
            {
                _log.Info("Connection Id from url: {0}", connectionId);
            }

            request.Items.Add(ConnectionIdKey, connectionId);

            Guid userId;

            if (request.Cookies[ConnectionManager.UserSessionCookieName] == null)
            {
                userId = _sysInfo.Guid();
                _log.Info("User ID created: {0}", userId);
            }
            else
            {
                userId = Guid.Parse(request.Cookies[ConnectionManager.UserSessionCookieName].Value);
                _log.Info("User ID found in cookie: {0}", userId);
            }

            Queue.PublishRequest(new ConnectionConnectRequest(connectionId, userId), ctx =>
            {
                ctx.HandleFault(f => { response.Status = HttpStatusCode.InternalServerError; });
                ctx.HandleTimeout(TimeSpan.FromSeconds(5), () => { response.Status = HttpStatusCode.RequestTimeout; });
                ctx.Handle <ConnectionConnectResponse>(
                    res =>
                {
                    response.Cookies.Add(new Cookie(ConnectionManager.UserSessionCookieName, res.UserId.ToString()));
                });
            });
            return(true);
        }
コード例 #2
0
        public async Task HandleConnectionAsync(CancellationToken cancellation)
        {
            _cancellation = cancellation;
            var unsubs       = new List <UnsubscribeAction>();
            var connectionId = GetConnectionId(_ws);
            var sessionId    = GetSessionId(_ws);

            try
            {
                _log.Info("Starting session '{0}' at connection '{1}'", sessionId, connectionId);

                unsubs.Add(_queue.SubscribeHandler <IConnectionEvent>(msg =>
                {
                    lock (_ws)
                    {
                        UserConnection user;
                        ConnectionManager._connections.TryGetValue(connectionId, out user);
                        if (user != null)
                        {
                            using (
                                var wsmsg =
                                    _ws.CreateMessageWriter(user.AesShook
                                        ? WebSocketMessageType.Binary
                                        : WebSocketMessageType.Text))
                                _serializer.Serialize(connectionId, msg, wsmsg);
                        }
                    }
                }, con => _ws.IsConnected && con.ConnectionId == connectionId));

                _queue.Publish(new UserConnectionEvent(connectionId, sessionId));

                while (_ws.IsConnected && !_cancellation.IsCancellationRequested)
                {
                    var msg = await _ws.ReadMessageAsync(_cancellation).ConfigureAwait(false);

                    if (msg == null)
                    {
                        continue;
                    }
                    Type type;
                    var  queueRequest = _serializer.Deserialize(connectionId, msg, out type);
                    if (queueRequest == null)
                    {
                        continue;
                    }

                    queueRequest.ConnectionId = connectionId;

                    _queue.Publish(queueRequest, type);
                }
            }
            catch (Exception aex)
            {
                _log.Error("Error Handling connection", aex.GetBaseException());
                try
                {
                    _ws.CloseAsync();
                }
                catch
                {
                    // ignored
                }
            }

            finally
            {
                // Console.WriteLine("Session '{0}' with connection '{1}' disconnected", sessionId, connectionId);

                foreach (var unsub in unsubs)
                {
                    unsub();
                }
                _ws.Dispose();
                _queue.Publish(new ConnectionDisconnectedRequest(connectionId, sessionId));
            }
        }