5

我要求我的网站始终显示当前在线的用户数量。例如,“35741 个用户当前在线”。这不是基于登录,而是基于我的网站上当前有多少用户。我已经尝试为此使用会话开始/会话结束,但是会话结束不可靠。因此,我得到了夸大的数字,因为我的会话开始添加了数字,但会话结束并没有删除它们,因为它没有触发。

没有额外的信息可以从中收集(报告等),只是要求显示数字。非常简单的请求正在变成一个巨大的交易。任何帮助表示赞赏。

编辑:

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

4

7 回答 7

8

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

于 2009-11-30T22:41:15.580 回答
3

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

于 2009-11-30T22:48:57.017 回答
2

使用性能计数器

  • State Server Sessions Active:活动用户会话的数量。
于 2009-11-30T22:43:48.897 回答
2

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

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

于 2009-11-30T22:43:01.350 回答
0

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

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

  1. 对于每个用户,发出一个包含唯一 ID 的 cookie
  2. 维护唯一 ID 及其最后访问时间的静态表
  3. 在 HttpModule(或 Global.asax)中,将新用户输入到表中并更新他们的访问时间(使用适当的锁定来防止竞争条件)
  4. 定期地,从后台线程或根据用户请求,从表中删除过去 N 分钟内未发出请求的条目。您可能还希望支持显式的“注销”功能。
  5. 以表格大小报告在线人数

如果您确实使用会话,则可以使用会话 ID 作为唯一标识符。但是,请记住,除非您配置了 Session_Start() 事件,否则在您将某些内容存储在 Session 字典中之前,不会发出 Session ID。

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

于 2009-12-01T06:04:28.213 回答
0

扩展丝绸在他的回答中所说的话 - 因为真正的 http 是无状态的,以确定用户当前是否“在线”,所以您实际上只能跟踪用户上次访问您的网站以来的时间,并确定您考虑的请求之间的时间间隔积极点。

既然您说这不是基于用户登录,那么它可能只是您在过去 5 分钟内收到了多少个不同 IP 地址的请求(或者您认为“在线”超时时间有多长)。

于 2009-11-30T22:51:33.513 回答
0

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

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

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

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

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

于 2011-02-03T20:03:55.300 回答