/// <summary> /// 发送消息给所有用户 /// </summary> /// <param name="Message">消息对象</param> /// <param name="Listener">前端监听对象,就是前台connection.on的第一个参数</param> /// <param name="ExceptAccountIds">群发时,需要屏蔽的用户ID</param> public Task SendAll(SignalrResponse Message, string Listener = "ServerMessage", string[] ExceptAccountIds = null) { //signalr自带的客户客户端管理模块是不和用户认证关联的,所以同一个账号在两个浏览器登陆的时候 //后登陆的不会把前登陆的覆盖,在signalr中是会被识别为两个客户端的 //所以这里使用轮询自己实现的客户端管理来处理群发 var tasks = new List <Task>(); foreach (var item in _clients) { if (!(ExceptAccountIds?.Contains(item.Value.AccountId) == true)) { tasks.Add(SendByConnectionId(item.Value.ConnectionId, Message, Listener)); } } return(Task.WhenAll(tasks)); }
/// <summary> /// 通过ConnectionId 发送给指定对象 /// </summary> /// <param name="ConnectionId">当前客户端连接ID</param> /// <param name="Message">消息对象</param> /// <param name="Listener">前端监听对象,就是前台connection.on的第一个参数</param> /// <returns></returns> public Task SendByConnectionId(string ConnectionId, SignalrResponse Message, string Listener = "ServerMessage") { return(_context.Clients.Client(ConnectionId).SendCoreAsync(Listener, new object[] { Message })); }
/// <summary> /// 发送消息给指定用户 /// </summary> /// <param name="AccountId">接收消息的用户ID</param> /// <param name="Message">消息对象</param> /// <param name="Listener">前端监听对象,就是前台connection.on的第一个参数</param> public Task Send(string AccountId, SignalrResponse Message, string Listener = "ServerMessage") { return(_context.Clients.Client(_clients.Where(c => c.Key == AccountId).FirstOrDefault().Value?.ConnectionId).SendCoreAsync(Listener, new object[] { Message })); }