学到新东西就记录一下。也许正好有人需要~~~~~~
由于需要记录当前在线用户,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集合里面有重复添加和删除的动作。
因为无法确认页面是最后一次关闭(或者是我没找到)所以才采用这种方法实现。