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 { private readonly IHttpContextAccessor _httpContextAccessor; private ILog log = LogManager.GetLogger(Startup.repository.Name, typeof(ChatHub)); ILogger _logger; public ChatHub(ILogger logger, IHttpContextAccessor httpContextAccessor) { _logger = logger; _httpContextAccessor = httpContextAccessor; } /// /// 客户端连接服务端 /// /// public override Task OnConnectedAsync() { log.Info("开启连接服务"); var id = Context.ConnectionId; _logger.LogInformation($"Client ConnectionId=> [[{id}]] Already Connection Server!"); return base.OnConnectedAsync(); } /// /// 客户端断开连接 /// /// /// public override Task OnDisconnectedAsync(Exception exception) { var id = Context.ConnectionId; // 使用线程安全方法移除连接 UserIdsStore.RemoveUser(id); _logger.LogInformation($"Client ConnectionId=> [[{id}]] Already Close Connection Server!"); return base.OnDisconnectedAsync(exception); } /// /// 给所有客户端发送消息 /// /// public async Task SendMessage(string data) { await Clients.All.SendAll(data); } /// /// 添加到在线用户列表(线程安全版) /// /// 用户编码 /// public async Task AddUser(string usercode) { if (string.IsNullOrEmpty(usercode)) { _logger.LogWarning("AddUser方法接收的usercode为空,忽略操作"); return; } string cid = Context.ConnectionId; try { // 调用线程安全的添加/更新方法 UserIdsStore.AddOrUpdateUser(cid, usercode); _logger.LogInformation($"用户[{usercode}]的连接[{cid}]已注册到在线列表"); } catch (Exception ex) { _logger.LogError(ex, $"添加用户[{usercode}]连接[{cid}]失败"); throw; // 抛出异常让客户端感知错误 } await Task.CompletedTask; // 无异步操作时返回已完成任务 } } }