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