ASP.NET 在线用户列表
由于在开发系统遇到在线列表的问题 ,在网上搜索一天多。主要问题集中在用户关闭浏览器后如何从列表中删除。(关于主动注销、会话超时比较易于处理,在此不再浪费大家时间)。
第一种方式:在客户端每隔一定的时间发出请求(大多采用的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会话期内,关闭本站的最后一个页面窗口要通知服务器更新列表。
本人学生,欢迎大家批评指正!