我想到的一种解决方法是客户端每隔一定的时间回发一个状态标识,服务器统计人数时,只统计有状态标识的。这种方法的关键点是选择一个合适的时间间隔。
建个在线用户表,表中有个字段是最后操作时间
如果一个用户登录,录入在线用户表,记录操作时间和登录时间,以及相关具体信息,同时判断在线用户表中所有人员的操作时间和当期时间间隔,如果超过30分钟,视为离线,并从在线用户表中删除此用户,
在用户操作时,记录关键的操作,[如写入数据库的操作,浏览重要信息的操作],将关键操作记录在线用户表,并同时检查在线用户的超时情况
我也关注这个问题,不知最后的操作时间如何去得到呢?用户一在网站上活动就能更新他的操作时间,不知这个是如何去办到呢
这个问题我想过好几种方法,不过都觉得不大妥
一:在应用程序的某个区域当中,比如一个静态区域,或者Application里,保存一个列表,表示当前哪些用户在线,当用户登录的时候,就在这个列表里加入这个用户,当用户退出,或者自然退出(比如Application_SessionEnd)时,从列表移除它,页面访问时查这个列表,从中筛出当前用户的好友。
二:数据库里用表户做个是否在线的标识——这是最早被我推翻的一种,因为这个标识不应当是“用户”实体的一个属性,这有违数据库设计的原则。
三:和1类似,只不过不在应用程序的内存区域里,在数据库里创建一个表,记录在线用户。和1相比优点在于应用程序重启后数据还在,虽然可能会有效性受到质疑,但起码数据还在,有效性可以通过编程来判断。1的优点在于数据在内存中,避免了每次读取时访问数据库的开销。
再说说用户是否活跃的判断方法吧,我想的是用类似于Cookie过期时间的判断方法,用户发生操作的时候(因为页面访问是要授权的,所以用户访问页面肯定是在有当前会话用户资料的基础上进行的,不会产生多大额外开销),更新其最后活跃时间。然后通过别的方法,每隔一段时间轮询数据库,把最后活跃时间与当前时间的差超过阈值的剔除。不过这个“轮询”好像不是很好实现,因为网页是被动触发的,所以也比较头疼。
能给点具体的代码吗???
public class user{
public string userName;
public DateTime userUpdate;
}
可以用statice Directionary<string,user>放在服务器端
客户端定时(每隔5分钟)更新 userUpdate这个字段
服务端写一个程序,定期(每隔8分钟)检查Directionary每个用户userUpdate这个字段,如果当前时间-userUpdate>5分钟,则说明用户离线或者非法退出,踢出用户。