如何通过asp.net core signalR将状态用户保持在线状态?

时间:2019-01-10 13:16:28

标签: asp.net-core asp.net-core-signalr

我正在做一个聊天项目。每当用户每次要获取数据库并获取所有用户时都希望登录并在线时,当然,我会通过connectionId将该用户登录。实际上,该用户在视图中具有connectionId显示。作为一个在线用户和其他用户都没有connectionId,它将以脱机用户的身份显示在视图中。但是我的问题是,当一个用户想要在线时,我向该用户添加了一个connectionId,如果另一个用户想要在线。先前的用户处于离线状态。我的想法是将每个在线用户都保留在数据库中,如果某个用户想退出聊天,则将该用户作为脱机用户在数据库中签名,反之亦然。您对此有何看法?在数据库中保留用户状态是错误的还是糟糕的想法?

enter image description here

public override async Task OnConnectedAsync()
        {
            List<UsersViewModel> usersList = new List<UsersViewModel>();
            var claimIdenity = Context.User.Identity as ClaimsIdentity;
            var userId = claimIdenity.Claims.FirstOrDefault
                (x => x.Type == ClaimTypes.NameIdentifier).Value;


            var users = await _dbContext.Users.ToListAsync();
            foreach (var user in users)
            {
                usersList.Add(new UsersViewModel
                {
                    UserId = user.Id,
                    FirstName = user.FirstName,
                    LastName = user.LastName,
                    PersonPicture = "https://devilsworkshop.org/files/2013/01/enlarged-facebook-profile-picture.jpg",

                });
            }


            UsersViewModel loginedUser = usersList.Where(u => u.UserId == userId).FirstOrDefault();
            if (loginedUser != null)
            {
                loginedUser.ConnectionId = Context.ConnectionId;
            }
            string jsonUsers = JsonConvert.SerializeObject(usersList);
            await Clients.All.SendAsync("GetAllUsers", jsonUsers);
            await base.OnConnectedAsync();
        }

0 个答案:

没有答案