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 方法 }