yl
2024-03-15 1ab89ba15fd521d83e809f52d6e50133814c042a
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 log4net;
using Microsoft.AspNet.SignalR.Hubs;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using VueWebCoreApi.Models;
using VueWebCoreApi.Tools;
 
namespace VueWebCoreApi.SignalR
{
    public class ChatHub : Hub<IChatClient>
    {
        private readonly IHttpContextAccessor _httpContextAccessor;
        private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(ChatHub));
        ILogger<ChatHub> _logger;
        public ChatHub(ILogger<ChatHub> logger, IHttpContextAccessor httpContextAccessor)
        {
            _logger = logger;
            _httpContextAccessor = httpContextAccessor;
        }
        /// <summary>
        /// 客户端连接服务端
        /// </summary>
        /// <returns></returns>
        public override Task OnConnectedAsync()
        {
            log.Info("开启连接服务");
            var id = Context.ConnectionId;
            _logger.LogInformation($"Client ConnectionId=> [[{id}]] Already Connection Server!");
            return base.OnConnectedAsync();
        }
        /// <summary>
        /// 客户端断开连接
        /// </summary>
        /// <param name="exception"></param>
        /// <returns></returns>
        public override Task OnDisconnectedAsync(Exception exception)
        {
            var id = Context.ConnectionId;
            // 删除用户ID
            UserIdsStore.Ids.Remove(id);
            _logger.LogInformation($"Client ConnectionId=> [[{id}]] Already Close Connection Server!");
            return base.OnDisconnectedAsync(exception);
        }
        /**
         * 测试 
         * */
        /// <summary>
        /// 给所有客户端发送消息
        /// </summary>
        /// <returns></returns>
        public async Task SendMessage(string data)
        {
            await Clients.All.SendAll(data);
        }
 
        /// <summary>
        /// 添加到在线用户列表
        /// </summary>
        /// <param name="usercode"></param>
        /// <returns></returns>
        public async Task AddUser(string usercode)
        {
            string cid = Context.ConnectionId;
            if (!UserIdsStore.Ids.ContainsValue(usercode))
            {
                await Task.Run(() => UserIdsStore.Ids.Add(cid, usercode));
            }
            else
            {
                //lambada表达式:根据值去键名Key
                string key = UserIdsStore.Ids.FirstOrDefault(d => d.Value == usercode).Key.ToString();
                // 创建一个新的键值对
                UserIdsStore.Ids.Add(cid, usercode);
                // 移除旧的键值对
                UserIdsStore.Ids.Remove(key);
            }
            
        }
    }
}