如何在没有使用Signalr的情况下单击任何用户登录时获取实时用户名?

问题描述

我有一个可以在某人登录时获得所有用户名的应用程序,但是我需要单击该按钮以显示所有用户,我希望在某人登录后立即实时显示所有用户。但是我可以注销该用户即时的。 下面的这段代码非常适合在单击按钮上获取用户名并实时注销用户

 [Authorize]
public class AuthHub : Hub
{
    private static ConcurrentDictionary<string,User> ActiveUsers = new ConcurrentDictionary<string,User>(StringComparer.InvariantCultureIgnoreCase);


    public IEnumerable<string> GetConnectedUsers()
    {

        return ActiveUsers.Where(x => {

            lock (x.Value.ConnectionIds)
            {

                return !x.Value.ConnectionIds.Contains(Context.ConnectionId,StringComparer.InvariantCultureIgnoreCase);
            }

        }).Select(x => x.Key);
    }

    public override Task OnConnected()
    {


        string userName = Context.User.Identity.Name;
        string connectionId = Context.ConnectionId;

        var user = ActiveUsers.GetorAdd(userName,_ => new User
        {
            Name = userName,ConnectionIds = new HashSet<string>()
        });

        lock (user.ConnectionIds)
        {

            user.ConnectionIds.Add(connectionId);

        }

        return base.OnConnected();
    }

    private User GetUser(string username)
    {

        User user;
        ActiveUsers.TryGetValue(username,out user);

        return user;
    }

    public void forcelogout(string to)
    {

        User receiver;
        if (ActiveUsers.TryGetValue(to,out receiver))
        {

            User sender = GetUser(Context.User.Identity.Name);

            IEnumerable<string> allReceivers;
            lock (receiver.ConnectionIds)
            {
                allReceivers = receiver.ConnectionIds.Concat(receiver.ConnectionIds);
            }

            foreach (var cid in allReceivers)
            {
                Clients.Client(cid).Signout();
            }
        }
    }
}

客户端代码

 $(function () {

        var chat = $.connection.authHub;

        chat.client.Signout = function () {
            $('#logoutForm').submit();
            $.connection.hub.stop();
        };

        $.connection.hub.start().done(function () {
            console.log("working");
            function PopulateActiveUsers() {

                $("#usersTable").empty();
                chat.server.getConnectedUsers().done(function (users) {
                    console.log("working");
                    $.each(users,function (i,username) {
                        $("#usersTable").append("<tr><th scope='row'>" + (i + 1) + "</th><td>" + username + "</td><td><a href='javascript:void(0)' data-user='" + username + "' class='btn btn-primary btn-sm btn-logout'>logout User</a></td></tr>");
                    });
                });
            }

            $("#displayActiveUsers").on("click",function () {
                PopulateActiveUsers();
            });

            $('body').on('click','a.btn-logout',function () {
                var username = $(this).attr('data-user');
                chat.server.forcelogout(username);
            });

        });

    });

解决方法

您将添加在OnConnected()事件期间从客户端调用以触发的相同方法。示例:

public override Task OnConnected()
{
  //Get your list of users however you do that now

  //Send back to all clients
  Client.All.yourClientMethod(users);
}

在您的客户端中,您只需要一种客户端方法即可像现在一样接收数据并对其进行处理。

,

我已经通过对代码进行如下修改来解决了问题

public void GetConnectedUsers()
    {

        Clients.All.getConnectedUsers(ActiveUsers.Where(x =>
        {

            lock (x.Value.ConnectionIds)
            {

                return x.Value.ConnectionIds.Contains(Context.ConnectionId,StringComparer.InvariantCultureIgnoreCase);
            }

        }).Select(x => x.Key).ToList());

        //return Clients.All(ActiveUsers.Select(x => x.Key).ToList());

    }

//客户端代码

$.connection.hub.start().done(function () {
                
        
                chat.server.getConnectedUsers().done(function (users) { });
    });

chat.client.getConnectedUsers = function (users) {
                $.each(users,function (i,username) {                   
                            $("#usersTable").append("<tr><th scope='row'>" + (i + 1) + "</th><td>" + username + "</td><td><a href='javascript:void(0)' data-user='" + username + "' class='btn btn-primary btn-sm btn-logout'>Logout User</a></td></tr>");
                });
            };