如何实现在线人数(Community Server 2.0)
因为工作需要最近要做一个跟踪在线用户的功能,自然想到了Community Server(下简称CS)有一个在用户跟踪的功能可以拿来参考一下,不过这个东西实在是比较庞大,找起来也不是很容易. 开始其实很简单,在Default.aspx 下面的第一个方法调用 : UsersOnline.SetLocation("Home"); 一直往下就找到了,这里的涉及到的几个类主要存在于CS的Component下面.
一般存储在线用户可以使用数据库,也可以使用Application变量或缓存等手段. 在CS使用了缓存期最高级别的缓存(不可移除/Permanent)来保存一个类的实例:UsersOnline, 个这类使用了单例模式, 这里面有两个HashTable分别用于存放已登陆用户和未登陆用户. 每次调用时先从缓存中取出单例,如果不存在则创建新的类实例. 根据CSContext上下文指示的用户的登陆状态来判断是存入哪一个HashTable,用户信息(User)来自于CSContext的User属性中(有缓存支持)作为参数初始化一个UserOnline的类,在UserOnline中存入当前时间作为最后活跃时间和用户当前所在的页面, 可以选择是否公开用不户所在位置的信息。最后将UserOnline存入UsersOnline的成员HashTable中。
因为支持多站点引用,所以在缓存时都加入了相应的键值以便区分. 同时UsersOnline也提供了3个方法,一个用于计算当前在线的成员数或者匿名用户数(MemberCount / GuestCount),另一个用于执行清理步骤,从缓存中删除最后活跃时间已经超过窗口期的用户,不过这个方法我还没想好怎么用,目前是单独做了一个Windows的服务,每隔一段时间就调这个方法清理用户,比如半小时一次(CleanMembers / CleanGuests), 还有一个方法:GetMembers / GetGuests, 用户取得在线用户的对象集合,返回一个ArrayList里面放的是UserOnline.
好了,大概的流程就是这个样子,我使用的CS是2.1版的,不知道其它的版本中有什么不一样.随便再说说这里用到的两个重要的类
1. CSContext,封装了HttpContext及用户信息,站点配置信息,一些Helper方法, 比如从QueryString里面读取参数等,存储于当前请求的上下文对象中, 这个对象里面的信息量较大,理解里面的信息架构有助于理解CS的结构设计.
2. CSCache, 这个东西稍微有点不爽因为是从System.We.Caching.Cache封装来的,所以这里的缓存只能在单台服务上使用,在集群环境下无法共享缓存,可以考虑使用Enterprise Lib里面的缓存块来改造, 因为目前不需要WebFarm布署,我就先拿过来将就用了.
关于如何定时活跃时间超时的用户,大家还有什么好办法欢迎与我讨论。
一般存储在线用户可以使用数据库,也可以使用Application变量或缓存等手段. 在CS使用了缓存期最高级别的缓存(不可移除/Permanent)来保存一个类的实例:UsersOnline, 个这类使用了单例模式, 这里面有两个HashTable分别用于存放已登陆用户和未登陆用户. 每次调用时先从缓存中取出单例,如果不存在则创建新的类实例. 根据CSContext上下文指示的用户的登陆状态来判断是存入哪一个HashTable,用户信息(User)来自于CSContext的User属性中(有缓存支持)作为参数初始化一个UserOnline的类,在UserOnline中存入当前时间作为最后活跃时间和用户当前所在的页面, 可以选择是否公开用不户所在位置的信息。最后将UserOnline存入UsersOnline的成员HashTable中。
因为支持多站点引用,所以在缓存时都加入了相应的键值以便区分. 同时UsersOnline也提供了3个方法,一个用于计算当前在线的成员数或者匿名用户数(MemberCount / GuestCount),另一个用于执行清理步骤,从缓存中删除最后活跃时间已经超过窗口期的用户,不过这个方法我还没想好怎么用,目前是单独做了一个Windows的服务,每隔一段时间就调这个方法清理用户,比如半小时一次(CleanMembers / CleanGuests), 还有一个方法:GetMembers / GetGuests, 用户取得在线用户的对象集合,返回一个ArrayList里面放的是UserOnline.
好了,大概的流程就是这个样子,我使用的CS是2.1版的,不知道其它的版本中有什么不一样.随便再说说这里用到的两个重要的类
1. CSContext,封装了HttpContext及用户信息,站点配置信息,一些Helper方法, 比如从QueryString里面读取参数等,存储于当前请求的上下文对象中, 这个对象里面的信息量较大,理解里面的信息架构有助于理解CS的结构设计.
2. CSCache, 这个东西稍微有点不爽因为是从System.We.Caching.Cache封装来的,所以这里的缓存只能在单台服务上使用,在集群环境下无法共享缓存,可以考虑使用Enterprise Lib里面的缓存块来改造, 因为目前不需要WebFarm布署,我就先拿过来将就用了.
关于如何定时活跃时间超时的用户,大家还有什么好办法欢迎与我讨论。