ServerHub.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. using Microsoft.AspNetCore.Cors;
  2. using Microsoft.AspNetCore.SignalR;
  3. using OASystem.Domain;
  4. using QuartzUI.Extension.AspNetCore.Enum;
  5. using SqlSugar;
  6. using System;
  7. using System.ComponentModel.DataAnnotations;
  8. using System.IdentityModel.Tokens.Jwt;
  9. using static OASystem.API.OAMethodLib.JWTHelper;
  10. namespace OASystem.API.OAMethodLib.Hubs
  11. {
  12. /// <summary>
  13. /// 站内通信 Hub
  14. /// </summary>
  15. public class ServerHub : Hub
  16. {
  17. /// <summary>
  18. /// 已连接的用户信息
  19. /// </summary>
  20. public static List<UserModel> OnlineUser { get; set; } = new List<UserModel>();
  21. private readonly ILogger<ServerHub> _logger;
  22. private readonly IHttpContextAccessor _accessor;
  23. public ServerHub( ILogger<ServerHub> logger, IHttpContextAccessor accessor)
  24. {
  25. _logger = logger;
  26. _accessor = accessor;
  27. }
  28. /// <summary>
  29. /// 当连接成功时执行
  30. /// </summary>
  31. /// <returns></returns>
  32. public override Task OnConnectedAsync()
  33. {
  34. string connId = Context.ConnectionId;
  35. _logger.LogWarning("SignalR已连接");
  36. //验证Token
  37. var token = _accessor.HttpContext.Request.Query["access_token"];
  38. var user = JwtHelper.SerializeJwt(token);
  39. _logger.LogWarning("SignalR已连接,用户名:" + user.UserName);
  40. //连接用户 这里可以存在Redis
  41. var model = new UserModel
  42. {
  43. UserId = user.Uid,
  44. ConnectionId = connId,
  45. Token = token,
  46. UserName = user.UserName
  47. };
  48. OnlineUser.Add(model);
  49. //给当前的连接分组 可以进行同一组接收消息 也可以用Token获取机构权限
  50. //await Groups.AddToGroupAsync(Context.ConnectionId, "测试组");
  51. //给当前连接返回消息 .Clients可以发多个连接ID
  52. Clients.Client(connId).SendAsync("ConnectResponse",
  53. new Result()
  54. {
  55. Code = 200,
  56. Data = model,
  57. Msg = user.UserName + "连接成功"
  58. });
  59. return base.OnConnectedAsync();
  60. }
  61. /// <summary>
  62. /// 当连接断开时的处理
  63. /// </summary>
  64. public override Task OnDisconnectedAsync(Exception exception)
  65. {
  66. string connId = Context.ConnectionId;
  67. var model = OnlineUser.Find(u => u.ConnectionId == connId);
  68. int count = OnlineUser.RemoveAll(u => u.ConnectionId == connId);
  69. if (model != null)
  70. {
  71. //给当前分组发送消息 在一个分组就能接收到消息
  72. //Clients.Group(model.GroupName).SendAsync("GetUsersResponse", result);
  73. //给当前连接返回消息 .Clients可以发多个连接ID
  74. Clients.Client(connId).SendAsync("DisconnectResponse",
  75. new Result()
  76. {
  77. Code = 400,
  78. Data = "true",
  79. Msg = "断开连接"
  80. });
  81. }
  82. return base.OnDisconnectedAsync(exception);
  83. }
  84. public async Task Send(string name, string message)
  85. {
  86. // Call the broadcastMessage method to update clients.
  87. await Clients.All.SendAsync("broadcastMessage", name, message);
  88. }
  89. /// <summary>
  90. /// 接受用户的数进行推送
  91. /// </summary>
  92. /// <returns></returns>
  93. public async Task SendMessage(string user, string msg)
  94. {
  95. Result result = new Result();
  96. result.Data = new UserModel
  97. {
  98. ConnectionId = Context.ConnectionId,
  99. Token = "",
  100. UserName = user
  101. };
  102. result.Code = 200;
  103. result.Msg = msg;
  104. //推送给所有连接ID的第一条数据
  105. await Clients.Clients(OnlineUser.Select(q => q.ConnectionId).ToList()).SendAsync("SendMessage", result);
  106. }
  107. }
  108. }