|   | 
|   | 
| namespace WIDESEAWCS_SignalR; | 
|   | 
| /// <summary> | 
| /// <inheritdoc cref="ISimpleHub"/> | 
| /// </summary> | 
| //[Authorize] | 
| [MapHub("/hubs/simple")] | 
| public class SimpleHub : Hub<ISimpleHub> | 
| { | 
|     private readonly ICacheService _simpleCacheService; | 
|   | 
|     public SimpleHub(ICacheService simpleCacheService) | 
|     { | 
|         _simpleCacheService = simpleCacheService; | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 连接 | 
|     /// </summary> | 
|     /// <returns></returns> | 
|     public override async Task OnConnectedAsync() | 
|     { | 
|         var token = Context.GetHttpContext().Request.Query["access_token"];//获取token | 
|         if (!string.IsNullOrEmpty(token)) | 
|         { | 
|             var userIdentifier = Context.UserIdentifier;//自定义的Id | 
|             UpdateRedis(userIdentifier, token);//更新redis | 
|         } | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 断开连接 | 
|     /// </summary> | 
|     /// <param name="exception"></param> | 
|     /// <returns></returns> | 
|     public override async Task OnDisconnectedAsync(Exception? exception) | 
|     { | 
|         var userIdentifier = Context.UserIdentifier;//自定义的Id | 
|         UpdateRedis(userIdentifier, null, false);//更新redis | 
|         await base.OnDisconnectedAsync(exception); | 
|     } | 
|   | 
|     /// <summary> | 
|     /// 退出登录 | 
|     /// </summary> | 
|     /// <param name="userId"></param> | 
|     /// <returns></returns> | 
|     public async Task LoginOut(string userId) | 
|     { | 
|         await Clients.User(userId).LoginOut("退出登录"); | 
|     } | 
|   | 
|     #region 方法 | 
|   | 
|     /// <summary> | 
|     /// 更新redis | 
|     /// </summary> | 
|     /// <param name="userIdentifier">用户id</param> | 
|     /// <param name="token">token</param> | 
|     /// <param name="ifConnect">是否是上线</param> | 
|     private void UpdateRedis(string userIdentifier, string token, bool ifConnect = true) | 
|     { | 
|         var userId = userIdentifier.Split("_")[0];//分割取第一个 | 
|         if (!string.IsNullOrEmpty(userId)) | 
|         { | 
|             //获取缓存当前用户的token信息列表 | 
|             var tokenInfos = _simpleCacheService.Get<List<UserInfo>>("Cache_UserToken"); | 
|             if (tokenInfos != null) | 
|             { | 
|                 if (ifConnect) | 
|                 { | 
|                     //获取redis中当前token | 
|                     var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault(); | 
|                     if (tokenInfo != null) | 
|                     { | 
|                         tokenInfos.Remove(tokenInfo);//删除原来的(一个用户只能有一个token) | 
|                         tokenInfo.Token_ID = userIdentifier;//添加到客户端列表 | 
|                         tokenInfo.Token = token;//添加到客户端列表 | 
|                         tokenInfo.UserId = userId.ToInt32(); //添加到客户端列表 | 
|                         tokenInfos.Add(tokenInfo); | 
|                         _simpleCacheService.Remove("Cache_UserToken");//删除Redis | 
|                         _simpleCacheService.AddObject("Cache_UserToken", tokenInfos);//更新Redis | 
|                     } | 
|                     else | 
|                     { | 
|                         tokenInfos.Add(new UserInfo() { Token = token, Token_ID = userIdentifier ,UserId = userId.ToInt32() }); | 
|                         _simpleCacheService.AddObject("Cache_UserToken", tokenInfos);//更新Redis | 
|                     } | 
|                 } | 
|                 else | 
|                 { | 
|                     //获取当前客户端ID所在的token信息 | 
|                     var tokenInfo = tokenInfos.Where(it => it.Token == token).FirstOrDefault(); | 
|                     if (tokenInfo != null) | 
|                     { | 
|                         tokenInfos.Remove(tokenInfo);//删除原来的(一个用户只能有一个token) | 
|                         _simpleCacheService.Remove("Cache_UserToken");//删除Redis | 
|                         _simpleCacheService.AddObject("Cache_UserToken", tokenInfos);//更新Redis | 
|                     } | 
|                 } | 
|             } | 
|             else | 
|             { | 
|                 if (ifConnect) | 
|                 { | 
|                     tokenInfos = new List<UserInfo> | 
|                     { | 
|                         new UserInfo() { Token = token, Token_ID = userIdentifier ,UserId = userId.ToInt32()  } | 
|                     }; | 
|                     _simpleCacheService.AddObject("Cache_UserToken", tokenInfos);//更新Redis | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     #endregion 方法 | 
| } |