namespace WIDESEAWCS_SignalR;
///
///
///
//[Authorize]
[MapHub("/hubs/simple")]
public class SimpleHub : Hub
{
private readonly ICacheService _simpleCacheService;
public SimpleHub(ICacheService simpleCacheService)
{
_simpleCacheService = simpleCacheService;
}
///
/// 连接
///
///
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
}
}
///
/// 断开连接
///
///
///
public override async Task OnDisconnectedAsync(Exception? exception)
{
var userIdentifier = Context.UserIdentifier;//自定义的Id
UpdateRedis(userIdentifier, null, false);//更新redis
await base.OnDisconnectedAsync(exception);
}
///
/// 退出登录
///
///
///
public async Task LoginOut(string userId)
{
await Clients.User(userId).LoginOut("退出登录");
}
#region 方法
///
/// 更新redis
///
/// 用户id
/// token
/// 是否是上线
private void UpdateRedis(string userIdentifier, string token, bool ifConnect = true)
{
var userId = userIdentifier.Split("_")[0];//分割取第一个
if (!string.IsNullOrEmpty(userId))
{
//获取缓存当前用户的token信息列表
var tokenInfos = _simpleCacheService.Get>("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
{
new UserInfo() { Token = token, Token_ID = userIdentifier ,UserId = userId.ToInt32() }
};
_simpleCacheService.AddObject("Cache_UserToken", tokenInfos);//更新Redis
}
}
}
}
#endregion 方法
}