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集合里面有重复添加和删除的动作。
因为无法确认页面是最后一次关闭(或者是我没找到)所以才采用这种方法实现。
最新文章
- 从“差不多了”到 正式发布 -- 新浪微博WinPhone UWP版诞生记
- N-Tier Entity Framework开源项目介绍
- arcmap Command
- cell 和 cellHeight的先后执行顺序
- 解决Django发送中文邮件时的编码及乱码问题
- java 15-2 Collection的高级功能测试
- linux基础命令学习(四)计划任务
- 页面加载后的input change事件 1或2个框 ajax
- c/c++ void 指针
- PHP 根据值查找键名
- java 内存 垃圾回收调优
- 读取和存储文本文件,UTF-8和GB2312通用的函数
- 新概念英语(1-37)Making a bookcase
- Allowed memory size of 134217728 bytes exhausted
- 我发起了一个 用 C 语言 作为 中间语言 的 编译器 项目 VMBC
- js焦点事件:onfocus、onblur、focus()、blur()、select()
- spoj 	Fast Multiplication
- overload与override的区别
- 18 [网络编程]-UDP
- FFMS2 API 译文 [原创]
热门文章
- 把dataset对象转换成list集合方法
- mybatis 操作数据错误Truncated incorrect DOUBLE value: &#39;&#39;
- HTML 学习杂记
- nginx的hash
- SparkStreaming updateStateByKey 保存记录信息
- Hadoop3集群搭建之——配置ntp服务
- 219.01.19 bzoj3252: 攻略(长链剖分+贪心)
- [zhuan]SQLServer查询最近一天,三天,一周,一月,一季度方法
- devexpress 的combobox怎样只能选择不能输入
- 利用url传多个参数