using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.SignalR;
using OASystem.Domain;
using QuartzUI.Extension.AspNetCore.Enum;
using SqlSugar;
using System;
using System.ComponentModel.DataAnnotations;
using System.IdentityModel.Tokens.Jwt;
using static OASystem.API.OAMethodLib.JWTHelper;
namespace OASystem.API.OAMethodLib.Hubs
{
///
/// 站内通信 Hub
///
public class ServerHub : Hub
{
///
/// 已连接的用户信息
///
public static List OnlineUser { get; set; } = new List();
private readonly ILogger _logger;
private readonly IHttpContextAccessor _accessor;
public ServerHub( ILogger logger, IHttpContextAccessor accessor)
{
_logger = logger;
_accessor = accessor;
}
///
/// 当连接成功时执行
///
///
public override Task OnConnectedAsync()
{
string connId = Context.ConnectionId;
_logger.LogWarning("SignalR已连接");
//验证Token
var token = _accessor.HttpContext.Request.Query["access_token"];
var user = JwtHelper.SerializeJwt(token);
_logger.LogWarning("SignalR已连接,用户名:" + user.UserName);
//连接用户 这里可以存在Redis
var model = new UserModel
{
UserId = user.Uid,
ConnectionId = connId,
Token = token,
UserName = user.UserName
};
OnlineUser.Add(model);
//给当前的连接分组 可以进行同一组接收消息 也可以用Token获取机构权限
//await Groups.AddToGroupAsync(Context.ConnectionId, "测试组");
//给当前连接返回消息 .Clients可以发多个连接ID
Clients.Client(connId).SendAsync("ConnectResponse",
new Result()
{
Code = 200,
Data = model,
Msg = user.UserName + "连接成功"
});
return base.OnConnectedAsync();
}
///
/// 当连接断开时的处理
///
public override Task OnDisconnectedAsync(Exception exception)
{
string connId = Context.ConnectionId;
var model = OnlineUser.Find(u => u.ConnectionId == connId);
int count = OnlineUser.RemoveAll(u => u.ConnectionId == connId);
if (model != null)
{
//给当前分组发送消息 在一个分组就能接收到消息
//Clients.Group(model.GroupName).SendAsync("GetUsersResponse", result);
//给当前连接返回消息 .Clients可以发多个连接ID
Clients.Client(connId).SendAsync("DisconnectResponse",
new Result()
{
Code = 400,
Data = "true",
Msg = "断开连接"
});
}
return base.OnDisconnectedAsync(exception);
}
public async Task Send(string name, string message)
{
// Call the broadcastMessage method to update clients.
await Clients.All.SendAsync("broadcastMessage", name, message);
}
///
/// 接受用户的数进行推送
///
///
public async Task SendMessage(string user, string msg)
{
Result result = new Result();
result.Data = new UserModel
{
ConnectionId = Context.ConnectionId,
Token = "",
UserName = user
};
result.Code = 200;
result.Msg = msg;
//推送给所有连接ID的第一条数据
await Clients.Clients(OnlineUser.Select(q => q.ConnectionId).ToList()).SendAsync("SendMessage", result);
}
}
}