ASP.NET MVC使用SignalR统计在线用户人数

时间:2024-10-04 10:05:08

学到新东西就记录一下。也许正好有人需要~~~~~~

由于需要记录当前在线用户,emmmm又是没做过的。。。

本来想用数据库的形式,但是想想这么简单的功能百度肯定有。遨游一波百度,有所收获。。。。

虽然老是那么几篇文章重复。。。。

大概就是在用户登录时Session记录下数据,前台获取展示。下面这个文章感觉蛮好的。

Session方法参考网址:

https://www.cnblogs.com/taobox/p/4466187.html

看文章想起了我项目中有用到SignaIR,这个可以实现聊天室肯定可以知道在线用户人数。果断继续百度得到如下结果。。。。

参考网址 :

https://www.red-gate.com/simple-talk/dotnet/asp-net/tracking-online-users-with-signalr/

SignaIR中有OnConnected,OnConnected,OnDisconnected三个方法,具体实现如下。

public class ChatHub : Hub
   {

//当前用户数量
        private static int _userCount = 0;

//存储用户信息
        private static List<string> list_UserName = new List<string>();

//链接
        public override Task OnConnected()
        {
            var username = Context.User.Identity.Name; //获取用户的名称
            if (!list_UserName.Contains(username))
            {
                _userCount++;
                list_UserName.Add(username);
            }
            else
            {
                list_UserName.Add(username);
            }
            var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
            context.Clients.All.online(_userCount);//推送全局,也可以推送给指定用户
            return base.OnConnected();
        }

//重连
        public override Task OnConnected()
        {
            var username = Context.User.Identity.Name;
            if (!list_UserName.Contains(username))
            {
                _userCount++;
                list_UserName.Add(username);
            }
            else
            {
                list_UserName.Add(username);
            }
            var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
            context.Clients.All.online(_userCount);
            return base.OnReconnected();
        }

//断开
        public override Task OnDisconnected(bool stopCalled)
        {
            var username = Context.User.Identity.Name;
            var count = list_UserName.Where(x => x == username).Count();
            if (count == 1)
            {
                _userCount--;
                list_UserName.Remove(username);
            }
            else
            {
                list_UserName.Remove(username);
            }
            var context = GlobalHost.ConnectionManager.GetHubContext<ChatHub>();
            context.Clients.All.online(_userCount);
            return base.OnDisconnected(stopCalled);
        }

}

JS:

var chat = $.connection.chatHub;

chat.client.online = function (count) {
        $("#online").html(count); //标签赋值
 }
    $.connection.hub.start();

这样就能得到有多少用户链接上来,然后我在_Layout.cshtml里面给控件赋值,就实现了。

上面做法有一点欠缺,应该可以看到我在list_UserName集合里面有重复添加和删除的动作。

因为无法确认页面是最后一次关闭(或者是我没找到)所以才采用这种方法实现。