2009-11-30 90 views
5

我有一个要求,即我的网站始终显示当前在线用户的数量。例如,“35741用户目前在线”。这不是基于登录,只是我的网站上有多少用户。我曾尝试使用会话开始/会话结束,但会话结束并不可靠。因此,我收到虚增的数字,因为我的会话开始添加数字,但会话结束时不会删除它们,因为它不会触发。跟踪当前在线用户的最佳方式

没有其他信息可以从这个(报告等)中收集到,只需要显示该号码即可。非常简单的要求变成了一笔巨额交易。任何帮助表示赞赏。

编辑:

我应该指出,我也尝试使用这个数据库。包含会话ID和最后一个活动列的简单表格。每打一页,我都会查看会话是否在我的数据库中。如果没有,插入。如果是这样,请更新活动时间。然后我运行一个扫描数据库的过程,在过去的20分钟内查找没有活动的会话。这种方法似乎杀死了我的SQL服务器和/或IIS。必须重新启动该网站。

+2

你最好的选择是Random.Next。其他一切都是可靠的。 – 2009-11-30 22:42:58

+0

@YuriyFaktorovich,技术上是真的:) – 2011-12-26 16:03:32

回答

8

最好的方法就像你一样,但通过活动时间。如果某个会话在5分钟左右内没有访问某个页面,则可能会认为它们不再处于活动状态。

+2

+1 \t我写的是同样的东西 – 2009-11-30 22:42:55

+0

正如我要打的输入... – Dave 2009-11-30 22:43:10

+0

我的确写了同样的东西! – Larsenal 2009-11-30 22:43:11

2

对于您可以录制的每个用户操作,您需要将它们视为“在线”,以便在特定时间段内进行操作。根据网站的情况,您可以将其设置为5分钟。实际的网络请求应该不到一秒钟。你必须假设有些假设他们可能停留在该页面上多长时间,并且什么也不做,只能在网上考虑。

这种方法要求您跟踪每个用户上次活动的时间。

3

如果您使用ASP.Net会员,看看GetNumberOfUsersOnline

+0

OP:“这是不是**基于登录”,“Membership.GetNumberOfUsersOnline”基于登录用户。 – 2013-09-14 06:39:59

0

在他的回答中扩展了什么柔滑 - 因为确实http是无状态的以确定用户目前是否在线,您只能追踪用户上次访问网站的时间,并确定请求之间的时间长短你的考虑仍然是积极的。

既然你声明这不是基于用户登录可能是一个简单的多少个不同的IP地址你在过去5分钟内收到的请求(或者你认为'在线'超时是多长时间) 。

0

不要为此使用会话,除非您还需要其他的会话;否则它是过度的。

假设一个单一服务器安装,做这样的事情:

  1. 对于每个用户,发出包含一个唯一的ID
  2. 保持唯一ID的静态表和它们的最后访问时间
  3. 一个cookie
  4. 在HttpModule(或Global.asax)中,向表中输入新用户并更新其访问时间(使用适当的锁定来防止竞争条件)
  5. 定期从后台线程或内联用户请求,从表格中删除条目在过去的N分钟内没有提出请求。您可能还想要支持显式的“注销”功能。
  6. 报告的人上网人数为表

如果你使用会话,您可以使用Session ID作为唯一标识符的大小。但是,请记住,除非您配置了Session_Start()事件,否则只有在会话字典中存储了某些内容之后才会发布会话ID。

在一个负载平衡或网络花园场景中,它会变得稍微复杂一些,但是您可以使用相同的基本思想,只需将信息保存在数据库中而不是内存中。

0

当用户登录时,将他的用户名写入HttpContext.Current.Cache并且滑动过期(例如20分钟)。

然后在Application.preRequestHandlerExecute中的Global.asax.cs中“触摸”当前用户的缓存条目,以便重置滑动过期。

当用户明确登出时,从HttpContext.Current.Cache中删除他的用户名。

如果你这样做,在任何给定的时间HttpContext.Current.Cache.Count会给你当前用户的#。

注意:这是假设您没有将Cache用于其他目的。

相关问题