【问题标题】:Best way to keep track of current online users跟踪当前在线用户的最佳方式
【发布时间】:2009-11-30 22:38:16
【问题描述】:

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

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

编辑:

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

【问题讨论】:

  • 您最好的选择是 Random.Next。其他一切都一样可靠。
  • @YuriyFaktorovich,技术上是正确的 :)

标签: asp.net statistics tracking


【解决方案1】:

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

【讨论】:

  • 好吧...原谅我这个愚蠢的问题,但是如何在不使用数据库的情况下跟踪会话?这个应用程序是用 .NET 1.1 编写的。
【解决方案2】:

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

【讨论】:

  • OP:“这不是基于登录的”,Membership.GetNumberOfUsersOnline 是基于登录的用户。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

    使用Performance Counters:

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

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

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

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

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

        【讨论】:

          【解决方案7】:

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-05
            • 1970-01-01
            相关资源
            最近更新 更多