代码之家  ›  专栏  ›  技术社区  ›  Kjartan

如何在ASP.NET核心信号器中迭代用户?

  •  0
  • Kjartan  · 技术社区  · 6 年前

    在.NET核心上的信号应用程序中,我有一个类似于以下代码的工作段:

    public Task SendPrivateMessage(string user, string message)
    {
        var sender = Context.User.Claims.FirstOrDefault(cl => cl.Type == "username")?.Value;
        return Clients.User(user)
                      .SendAsync("ReceiveMessage", $"Message from {sender}: {message}");
    }
    

    这将从当前连接的用户向指定的用户发送消息。

    现在,我想给 每一个 用户连接;类似以下概念:

    public Task UpdateMessageStatus()
    {
        foreach(client in Clients.Users)
        {
             var nrOfMessages = GetMessageCount();
             client.SendAsync($"You have {nrOfMessages} messages.");
        }
    }
    

    我怎样才能做到这一点,也就是说,我如何迭代连接的用户,并向每个用户发送单独的消息?

    编辑/澄清

    如前所述,我需要发送 个人 (即专用)发送给每个连接用户的消息,因此使用 Clients.All 不是一个选项,因为它只能用于向所有连接的用户发送相同的消息。

    最后我做了一件和马克C.在接受的答案中发布的相似的事情。

    3 回复  |  直到 6 年前
        1
  •  3
  •   Mark C.    6 年前

    如果你死定了不使用 Clients.All 提供给您的API,您可以保留已连接用户的本地缓存,并将其用作已连接用户的列表。

    像这样:

    static HashSet<string> CurrentConnections = new HashSet<string>();
    
        public override Task OnConnected()
        {
            var id = Context.ConnectionId;
            CurrentConnections.Add(id);
    
            return base.OnConnected();
        }
    
        public Task SendAllClientsMessage()
        {
            foreach (var activeConnection in GetAllActiveConnections())
            {
                Clients.Client(activeConnection).SendMessageAsync("Hi");
            }
        }
    
        public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
        {
            var connection = CurrentConnections.FirstOrDefault(x => x == Context.ConnectionId);
    
            if (connection != null)
            {
                CurrentConnections.Remove(connection);
            }
    
            return base.OnDisconnected(stopCalled);
        }
    
    
        //return list of all active connections
        public List<string> GetAllActiveConnections()
        {
            return CurrentConnections.ToList();
        }
    
        2
  •  1
  •   dcy    6 年前

    你可以使用客户端。全部发送消息给你的所有客户端。

    返回clients.all.sendasync(“receiveMessage”,$“来自的消息” 发送方:消息”);

        3
  •  0
  •   Kjartan    6 年前

    我最终创建了一个管理自己的已连接用户列表,类似于 answer provided by Mark C. .

    只是稍微扩展一下,这将允许我做一些类似以下概念的事情:

    public async Task CheckAllMessages()
    {
        foreach (var user in ConnectedUsers)
        {
           var nr = GetNrOfMessagesForUser(user);
           if(nr > 0)
           {
               await Clients.User(user)
                            .SendAsync("ReceiveMessage", 
                                       $"User ({user}) has {nr} new messages waiting.");
           }
        }
    }