Blame view

Yi.Abp.Net8/module/rbac/Yi.Framework.Rbac.Application/SignalRHubs/OnlineHub.cs 2.99 KB
515fceeb   “wangming”   框架初始化
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
  using System.Collections.Concurrent;
  using Microsoft.AspNetCore.Authorization;
  using Microsoft.AspNetCore.Http;
  using Microsoft.AspNetCore.SignalR;
  using Microsoft.Extensions.Logging;
  using Volo.Abp.AspNetCore.SignalR;
  using Yi.Framework.Rbac.Domain.Entities;
  using Yi.Framework.Rbac.Domain.Shared.Model;
  
  namespace Yi.Framework.Rbac.Application.SignalRHubs
  {
      [HubRoute("/hub/main")]
      //开放不需要授权
      //[Authorize]
      public class OnlineHub : AbpHub
      {
          public static ConcurrentDictionary<string, OnlineUserModel> ClientUsersDic { get; set; } = new();
  
          private readonly HttpContext? _httpContext;
          private ILogger<OnlineHub> _logger => LoggerFactory.CreateLogger<OnlineHub>();
  
          public OnlineHub(IHttpContextAccessor httpContextAccessor)
          {
              _httpContext = httpContextAccessor?.HttpContext;
          }
  
  
          /// <summary>
          /// 成功连接
          /// </summary>
          /// <returns></returns>
          public override Task OnConnectedAsync()
          {
              if (_httpContext is null)
              {
                  return Task.CompletedTask;
              }
              var name = CurrentUser.UserName;
              var loginUser = new LoginLogAggregateRoot().GetInfoByHttpContext(_httpContext);
  
              OnlineUserModel user = new(Context.ConnectionId)
              {
                  Browser = loginUser?.Browser,
                  LoginLocation = loginUser?.LoginLocation,
                  Ipaddr = loginUser?.LoginIp,
                  LoginTime = DateTime.Now,
                  Os = loginUser?.Os,
                  UserName = name ?? "Null",
                  UserId = CurrentUser.Id ?? Guid.Empty
              };
  
              //已登录
              if (CurrentUser.IsAuthenticated)
              {
                  ClientUsersDic.RemoveAll(u => u.Value.UserId == CurrentUser.Id);
                  _logger.LogDebug(
                      $"{DateTime.Now}:{name},{Context.ConnectionId}连接服务端success,当前已连接{ClientUsersDic.Count}个");
              }
  
              ClientUsersDic.AddOrUpdate(Context.ConnectionId, user, (_, _) => user);
  
              //当有人加入,向全部客户端发送当前总数
              Clients.All.SendAsync("onlineNum", ClientUsersDic.Count);
  
              return base.OnConnectedAsync();
          }
  
  
          /// <summary>
          /// 断开连接
          /// </summary>
          /// <param name="exception"></param>
          /// <returns></returns>
          public override Task OnDisconnectedAsync(Exception? exception)
          {
              //已登录
              if (CurrentUser.IsAuthenticated)
              {
                  ClientUsersDic.RemoveAll(u => u.Value.UserId == CurrentUser.Id);
                  _logger.LogDebug($"用户{CurrentUser?.UserName}离开了,当前已连接{ClientUsersDic.Count}个");
              }
              ClientUsersDic.Remove(Context.ConnectionId, out _);
              Clients.All.SendAsync("onlineNum", ClientUsersDic.Count);
              return base.OnDisconnectedAsync(exception);
          }
      }
  }