diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Model/OnlineUserModel.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Model/OnlineUserModel.cs
index bd9958fd..fc3cbccb 100644
--- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Model/OnlineUserModel.cs
+++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain.Shared/Model/OnlineUserModel.cs
@@ -24,7 +24,7 @@ namespace Yi.Framework.Rbac.Domain.Shared.Model
///
/// 用户id
///
- public long? UserId { get; set; }
+ public Guid? UserId { get; set; }
public string? UserName { get; set; }
public DateTime LoginTime { get; set; }
public string? Ipaddr { get; set; }
diff --git a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/SignalRHubs/OnlineUserHub.cs b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/SignalRHubs/OnlineUserHub.cs
index 04771480..9335c9df 100644
--- a/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/SignalRHubs/OnlineUserHub.cs
+++ b/Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Domain/SignalRHubs/OnlineUserHub.cs
@@ -13,7 +13,7 @@ namespace Yi.Framework.Rbac.Domain.SignalRHubs
public class OnlineUserHub : AbpHub
{
public static readonly List clientUsers = new();
-
+ private readonly static object objLock = new object();
private HttpContext? _httpContext;
private ILogger _logger => LoggerFactory.CreateLogger();
@@ -30,33 +30,40 @@ namespace Yi.Framework.Rbac.Domain.SignalRHubs
///
public override Task OnConnectedAsync()
{
- var name = CurrentUser.UserName;
- var loginUser = new LoginLogEntity().GetInfoByHttpContext(_httpContext);
- var user = clientUsers.Any(u => u is not null && u.ConnnectionId == Context.ConnectionId);
- //判断用户是否存在,否则添加集合
- if (!user)
+ lock (objLock)
{
- OnlineUserModel users = new(Context.ConnectionId)
+
+ var name = CurrentUser.UserName;
+ var loginUser = new LoginLogEntity().GetInfoByHttpContext(_httpContext);
+ var user = clientUsers.Any(u => u is not null && u.ConnnectionId == Context.ConnectionId);
+ //判断用户是否存在,否则添加集合
+ if (!user)
{
- Browser = loginUser?.Browser,
- LoginLocation = loginUser?.LoginLocation,
- Ipaddr = loginUser?.LoginIp,
- LoginTime = DateTime.Now,
- Os = loginUser?.Os,
- UserName = name ?? "Null"
- };
- clientUsers.Add(users);
- _logger.LogInformation($"{DateTime.Now}:{name},{Context.ConnectionId}连接服务端success,当前已连接{clientUsers.Count}个");
+ OnlineUserModel users = new(Context.ConnectionId)
+ {
+ Browser = loginUser?.Browser,
+ LoginLocation = loginUser?.LoginLocation,
+ Ipaddr = loginUser?.LoginIp,
+ LoginTime = DateTime.Now,
+ Os = loginUser?.Os,
+ UserName = name ?? "Null",
+ UserId = CurrentUser.Id ?? Guid.Empty
+ };
- //Clients.All.SendAsync(HubsConstant.MoreNotice, SendNotice());
- //当有人加入,向全部客户端发送当前总数
- Clients.All.SendAsync("onlineNum", clientUsers.Count);
+
+ //先移除之前的用户id,一个用户只能一个
+ clientUsers.RemoveAll(u => u.UserId == CurrentUser.Id);
+ clientUsers.Add(users);
+ _logger.LogInformation($"{DateTime.Now}:{name},{Context.ConnectionId}连接服务端success,当前已连接{clientUsers.Count}个");
+
+ //当有人加入,向全部客户端发送当前总数
+ Clients.All.SendAsync("onlineNum", clientUsers.Count);
+ }
}
-
- //Clients.All.SendAsync(HubsConstant.OnlineUser, clientUsers);
return base.OnConnectedAsync();
}
+
///
/// 断开连接
///
@@ -64,19 +71,17 @@ namespace Yi.Framework.Rbac.Domain.SignalRHubs
///
public override Task OnDisconnectedAsync(Exception exception)
{
- var user = clientUsers.Where(p => p.ConnnectionId == Context.ConnectionId).FirstOrDefault();
- //判断用户是否存在,否则添加集合
- if (user != null)
+ lock (objLock)
{
- var clientUser = clientUsers.FirstOrDefault(x => x.ConnnectionId == user.ConnnectionId);
- if (clientUser is not null)
+ var user = clientUsers.Where(p => p.ConnnectionId == Context.ConnectionId).FirstOrDefault();
+ //判断用户是否存在,否则添加集合
+ if (user != null)
{
- clientUsers.Remove(clientUser);
+ clientUsers.RemoveAll(u => u.UserId == CurrentUser.Id || u.ConnnectionId == u.ConnnectionId);
Clients.All.SendAsync("onlineNum", clientUsers.Count);
- //Clients.All.SendAsync(HubsConstant.OnlineUser, clientUsers);
_logger.LogInformation($"用户{user?.UserName}离开了,当前已连接{clientUsers.Count}个");
- }
+ }
}
return base.OnDisconnectedAsync(exception);
}