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


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

    由于需要记录当前在线用户,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集合里面有重复添加和删除的动作。

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

  • 相关阅读:
    jedis 连接 虚拟机内redis服务
    数据库存储过程项目总结
    前端jsp联系项目相关经验
    学习做项目的一些随笔
    循环
    字典
    集合
    元组
    列表
    字符串
  • 原文地址:https://www.cnblogs.com/psjinfo/p/9450625.html
Copyright © 2020-2023  润新知