刘磊
2025-04-19 bd02cb3fa0fa75ffafb2cf17501929b1b1e0029b
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
 
 
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 方法
}