1. 程式人生 > >.NET MVC采用SignalR更新在線用戶數

.NET MVC采用SignalR更新在線用戶數

oba count() log 當前在線 task 想想 實現 gate 項目

學到新東西就記錄一下。也許正好有人需要~~~~~~

由於需要記錄當前在線用戶,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集合裏面有重復添加和刪除的動作。

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

.NET MVC采用SignalR更新在線用戶數