public async Task Invoke(HttpContext context)
        {
            if (!context.WebSockets.IsWebSocketRequest)
            {
                return;
            }

            var socket = await context.WebSockets.AcceptWebSocketAsync();

            string token    = context.Request.Query["token"];
            string userName = string.Empty;
            string UserId   = string.Empty;

            if (!string.IsNullOrEmpty(token) && token != "null")
            {
                TokenModelJwt tokenModelJwt = JWTTokenService.SerializeJwt(token);
                userName = tokenModelJwt.Name;
                UserId   = tokenModelJwt.Uid.ToString();
            }
            else
            {
                var Json = new WebSocketUpdateResponse <string>()
                {
                    state = 200,
                    type  = 100
                }.ToJson();
                await _webSocketHandler.SendMessageAsync(socket, Json);

                await Task.Delay(1000);

                await connectionManager.CloseSocket(socket);

                return;
            }
            var websocketItem = connectionManager.GetSocketByModel(UserId);

            if (websocketItem != null)
            {
                var Json = new WebSocketUpdateResponse <string>()
                {
                    state = 200,
                    type  = websocketItem.token != token ? 500 : 100
                }.ToJson();
                await _webSocketHandler.SendMessageAsync(websocketItem.socket, Json);

                await Task.Delay(1000);

                await connectionManager.RemoveSocket(UserId);
            }
            var ipaddress = context.Connection.RemoteIpAddress.ToIPv4String();
            var userAgent = context.Request.Headers["User-Agent"];
            var agent     = new UserAgent(userAgent);
            var Browser   = $"{agent.Browser?.Name} {agent.Browser?.Version}";
            var OS        = $"{agent.OS?.Name} {agent.OS?.Version}";
            var webSocket = new WebSocketModel()
            {
                connectstate = true,
                connectTime  = DateTime.Now,
                Guid         = UserId,
                socket       = socket,
                userName     = userName,
                Browser      = Browser,
                ip           = ipaddress,
                OS           = OS,
                token        = token
            };

            _webSocketHandler.OnConnectedAsync(webSocket);
            await Receive(socket, async (result, buffer) =>
            {
                if (result.MessageType == WebSocketMessageType.Text)
                {
                    await _webSocketHandler.ReceiveAsync(token, socket, result, buffer);
                    return;
                }

                else if (result.MessageType == WebSocketMessageType.Close)
                {
                    await _webSocketHandler.OnDisconnected(socket);
                    return;
                }
            });
        }
Esempio n. 2
0
 public virtual void OnConnectedAsync(WebSocketModel webSocket)
 {
     WebSocketConnectionManager.AddSocket(webSocket);
 }
 public void AddSocket(WebSocketModel webSocket)
 {
     _sockets.GetOrAdd(webSocket.Guid, webSocket);
 }