跟踪当前在线用户的最佳方式

时间:2009-11-30 22:38:16

标签: asp.net statistics tracking

我要求我的网站始终显示当前在线的用户数。例如,“35741用户当前在线”。这不是基于登录,只是我的网站上当前有多少用户。我已尝试使用Session Start / Session End,但会话结束不可靠。因此,当我的会话开始添加数字但是会话结束时不会删除它们,因为它不会触发,我会得到数字膨胀。

没有从此收集的其他信息(报告等),只是要求显示该号码。非常简单的请求变成了一个巨大的交易。任何帮助表示赞赏。

编辑:

我应该指明我也尝试过使用数据库。包含会话ID和最后一个活动列的简单表。每次点击页面,我都会检查会话是否在我的数据库中。如果没有,请插入。如果是,请使用活动时间进行更新。然后我运行一个扫描数据库的过程,在过去20分钟内查找没有活动的会话。这种方法似乎会破坏我的SQL服务器和/或IIS。不得不重启网站。

7 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:3)

如果您使用的是ASP.Net会员资格,请查看GetNumberOfUsersOnline

答案 2 :(得分:2)

对于您可以记录的每个用户操作,您需要在某个时间窗口“在线”考虑它们。根据站点的不同,您可以将其设置为5分钟。实际的Web请求应该不到一秒钟。你必须做出一些的假设,假设他们可以留在该页面上多长时间,除了被认为是在线之外什么都不做。

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

答案 3 :(得分:2)

使用Performance Counters

  
      
  • 状态服务器会话有效:   活跃用户会话数。
  •   

答案 4 :(得分:0)

扩展silky在他的回答中所说的内容 - 因为http确定无用状态以确定用户当前是否“在线”,您实际上只能跟踪用户上次访问您网站的时间,并确定请求之间的时间长度考虑仍然活跃。

由于您声明这不是基于登录的用户,可能是您在过去5分钟内收到多少个不同IP地址的简单(或者您认为“在线”超时时间有多长)。

答案 5 :(得分:0)

除非您还需要其他会话,否则不要使用会话;否则就太过分了。

假设安装了单服务器,请执行以下操作:

  1. 对于每个用户,请发出包含唯一ID的Cookie
  2. 维护唯一ID的静态表及其上次访问时间
  3. 在HttpModule(或Global.asax)中,在表格中输入新用户并更新其访问时间(使用适当的锁定以防止竞争条件)
  4. 定期从后台线程或与用户请求内联,从表中删除最近N分钟内未发出请求的条目。您可能还希望支持明确的“注销”功能。
  5. 报告在线人数作为表格的大小
  6. 如果您使用会话,则可以使用会话ID作为唯一标识符。但是,请记住,除非您在Session字典中存储了某些内容,否则不会发出会话ID,除非您配置了Session_Start()事件。

    在负载均衡或Web园景中,它会变得更复杂,但您可以使用相同的基本想法,只需将信息保存在数据库中而不是内存中。

答案 6 :(得分:0)

当用户登录时,将他的用户名写入HttpContext.Current.Cache,滑动到期(比如说20分钟)。

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

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

如果这样做,在任何给定时间HttpContext.Current.Cache.Count将为您提供当前用户数。

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