Пример #1
0
        /// <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));
        }
Пример #2
0
 /// <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 }));
 }
Пример #3
0
        /// <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 }));
        }