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集合里面有重復添加和刪除的動作。

因為無法確認頁面是最后一次關閉(或者是我沒找到)所以才采用這種方法實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM