ASP.NET 在线用户列表

cnsd169 2008-04-16 11:30:13
由于在开发系统遇到在线列表的问题 ,在网上搜索一天多。主要问题集中在用户关闭浏览器后如何从列表中删除。(关于主动注销、会话超时比较易于处理,在此不再浪费大家时间)。

第一种方式:在客户端每隔一定的时间发出请求(大多采用的xmlhttp、AJAX结合timer的callback),在服务器端通过时间戳判定。
网上针对这方面的文章和源码不少,好像大家比较认可。首先肯定的是能够比较精确的控制在线用户,这是此中方式的优点。但缺点也很明显,对网络的负担太大。比如有n个用户,每个用户打开m个页面,每隔1分钟刷新一次。即使用户不做任何提交动作,1分钟就有n×m的请求量。对网络流量和资源来讲,显然不能接受!何况在服务器端维护一个列表,本身开销就很大,通过数据库标记在线的更不可想像。流量稍大点的网站,不可取!
第二中方式: 应用 Application_AcquireRequestState(IHttpModule)
这种方式也没有跳出第一种的思路,也需要TimerCallback定时回调刷新列表。

第三中方式:window_unload事件是触发的
这种方式是写一个logout.aspx页面,在系统页面关闭的时候的Window_unload事件中打开logout.aspx页面中释放会话,进而删除用户列表中的用户。
有用户扩展到xmlhttp来进行异步提交。

第四中方式:应用Page_Dispose
没有见到实现的实例源码?不便多说。
总结;
首先、我认为一、二两种方式不可取,随着访问量的增大,死锁问题不说,资源耗费太大,流量负载成数量级增加!
其次、我认为三、四方式的思路是正确的。打开几个页面就处理几次。也应该是我们首先考虑到的?
不过IE6和IE7对window_unload事件的处理不同……;需要处理打开的页面数量。
针对第四中方式应用Page_Dispose还是多说一句吧!从页面的生命周期和事件执行顺序进一步考虑,这种设计思路应该是能够实现的,不一定是Page_Dispose事件。
我也正在做这方面的实例,完成后定会传上来。
最后、需要说的是有些问题不要考虑的过于复杂,针对本问题实际上就是一点需求-在session会话期内,关闭本站的最后一个页面窗口要通知服务器更新列表。

本人学生,欢迎大家批评指正!
...全文
321 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
datahandler2 2008-04-16
  • 打赏
  • 举报
回复
本人有个想法。在用户登录时进行缓存该用户Session,在Glob.asax的 void Session_End()中在移除该缓存的该用户SESSION. ,然后我们可以注册Trimer事件间隔判断缓存某用户是否为空来掌握该用户是否已经离线。
shazibanzhu 2008-04-16
  • 打赏
  • 举报
回复
以前碰到过这样的问题,最后也没有很好的解决
用户过3分钟请求一次服务器,这样不能及时得到用户下线,如果用户每几秒请求一次,对服务器压力太大,
不知道什么方法可以做到及时得到用户下线通知,还不用频繁刷新
lz1201048 2008-04-16
  • 打赏
  • 举报
回复
这个我以前搞过...晚上有空发到博客上:)
ccp5780199 2008-04-16
  • 打赏
  • 举报
回复
关闭session 有很多方法无法判断,比如突然断线,如直接重启网线拔掉之类的
这种似乎最简单的处理方法还是得用session过期,如果是考虑到服务端的性能情况
可以用static HashTbale来存放,毕竟application更耗能

62,047

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧