ASP.NET在线用户列表精确版——解决用户意外退出在线列表无法及时更新问题

阅读更多

[分享]一个在线用户列表解决方案(解决用户意外退出在线列表无法及时更新问题) 顺便散分 ~~

07-18

最近所做的一个项目需要用到的在线用户列表,上网搜索了一下发现现有的解决方案对用户意外退出的处理均不是太理想。一般来说,用户离开系统的方式有三种:主动注销、会话超时、直接关闭浏览器,对于前两种,我们很容易便可将该用户从在线列表中清除,关键是第三种(很多用户都是直接关闭窗口的~~郁闷ing),程序无法捕获窗口关闭的精确时间,只能等到会话超时后在能将该用户清除出在线列表,假设我们设置会话超时时间为60分钟,而用户登陆系统随便浏览一个页面就以关闭浏览器的方式退出的话,我们要在将近1小时后才能从在线列表中将该用户清除出去(想象一下,系统显示n多人在线,可能除了你之外其他的n-1人都关机走人了,汗一个先```),而本文将尝试寻找一个解决方案把这种尴尬降至最低。rn 我的大概思路是,给每在线用户增加一个RefreshTime属性,建立一个负责将当前用户的RefreshTime属性设置为当前时间的单独页面(Refresh.aspx),然后在系统的主要页面(也可以是所有页面)中通过xmlhttp不断地请求Refresh.aspx页面,一旦用户关闭了与本系统相关的所有窗口,即以直接关闭浏览器的方式退出系统,那么该用户的RefreshTime属性便不会自动更新了,我们再设置一个自动刷新的超时时间(这个要比会话超时短很多_refreshTimeout),当发现某用户超过_refreshTimeout的时间没有自动刷新,就能判定该用户已经以直接关闭浏览器的方式退出了。rn 假设我们设置会话超时时间为60分钟,自动刷新超时时间为1分钟,在客户端通过xmlhttp每隔25秒(之所以不设1分钟,是防止网速慢的时候访问Refresh.aspx超时,个人感觉,不一定正确)访问一次Refresh.aspx页面,在用户登陆、用户注销、检测用户是否在线的时候都执行清理超时用户(包括会话超时和自动刷新超时)操作,这样一来,在线用户列表的统计误差就由60分钟降至1分钟了。rnrn全文地址:http://blog.csdn.net/cncxz/archive/2005/07/18/427778.aspx

ASP.NET 在线用户列表

04-16

由于在开发系统遇到在线列表的问题 ,在网上搜索一天多。主要问题集中在用户关闭浏览器后如何从列表中删除。(关于主动注销、会话超时比较易于处理,在此不再浪费大家时间)。rnrn 第一种方式:在客户端每隔一定的时间发出请求(大多采用的xmlhttp、AJAX结合timer的callback),在服务器端通过时间戳判定。rn 网上针对这方面的文章和源码不少,好像大家比较认可。首先肯定的是能够比较精确的控制在线用户,这是此中方式的优点。但缺点也很明显,对网络的负担太大。比如有n个用户,每个用户打开m个页面,每隔1分钟刷新一次。即使用户不做任何提交动作,1分钟就有n×m的请求量。对网络流量和资源来讲,显然不能接受!何况在服务器端维护一个列表,本身开销就很大,通过数据库标记在线的更不可想像。流量稍大点的网站,不可取!rn 第二中方式: 应用 Application_AcquireRequestState(IHttpModule)rn 这种方式也没有跳出第一种的思路,也需要TimerCallback定时回调刷新列表。rn rn 第三中方式:window_unload事件是触发的rn 这种方式是写一个logout.aspx页面,在系统页面关闭的时候的Window_unload事件中打开logout.aspx页面中释放会话,进而删除用户列表中的用户。rn 有用户扩展到xmlhttp来进行异步提交。rn rn 第四中方式:应用Page_Disposern 没有见到实现的实例源码?不便多说。rn 总结;rn 首先、我认为一、二两种方式不可取,随着访问量的增大,死锁问题不说,资源耗费太大,流量负载成数量级增加!rn 其次、我认为三、四方式的思路是正确的。打开几个页面就处理几次。也应该是我们首先考虑到的?rn 不过IE6和IE7对window_unload事件的处理不同……;需要处理打开的页面数量。rn 针对第四中方式应用Page_Dispose还是多说一句吧!从页面的生命周期和事件执行顺序进一步考虑,这种设计思路应该是能够实现的,不一定是Page_Dispose事件。rn我也正在做这方面的实例,完成后定会传上来。rn 最后、需要说的是有些问题不要考虑的过于复杂,针对本问题实际上就是一点需求-在session会话期内,关闭本站的最后一个页面窗口要通知服务器更新列表。rn rn 本人学生,欢迎大家批评指正!

没有更多推荐了,返回首页