Asp.net 跟踪当前在线用户的最佳方法

Asp.net 跟踪当前在线用户的最佳方法,asp.net,statistics,tracking,Asp.net,Statistics,Tracking,我有一个要求,我的网站总是显示当前在线用户的数量。例如,“35741名用户当前在线”。这不是基于登录,而是基于我的站点上当前有多少用户。我已经尝试使用会话开始/会话结束进行此操作,但是会话结束不可靠。因此,我得到了夸大的数字,因为我的会话开始添加数字,但会话结束不会删除它们,因为它不会触发 没有其他信息可从中收集(报告等),只是要求显示数字。非常简单的请求正在变成一笔巨大的交易。感谢您的帮助 编辑: 我应该指定我也尝试过使用数据库来实现这一点。包含会话ID和最后一个活动列的简单表。每次点击页面时

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

没有其他信息可从中收集(报告等),只是要求显示数字。非常简单的请求正在变成一笔巨大的交易。感谢您的帮助

编辑:


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

最好的方法是像您这样做,但通过活动将其超时。如果给定的会话不在5分钟内访问一个页面,则可能会认为它们不再活跃。

< P>对于可以记录的每个用户行为,您需要在某个时间窗口中考虑它们“在线”。根据站点的不同,您可以将其设置为5分钟。实际的web请求应该不到一秒钟。你必须做出一些假设,他们可能会在那个页面上停留多长时间,什么也不做,只会被认为是在线的

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

使用:

  • 状态服务器会话处于活动状态:服务器会话 活动用户会话数

如果您使用ASP.NET成员资格,请查看.< /p> 扩展他的回答中的Struk——因为真正的HTTP是无状态的,以确定用户当前是否“在线”,您只能跟踪用户上次访问您的站点的时间,并确定您认为仍然处于活动状态的请求之间的时间。


既然你声明这不是基于用户登录的,那么在过去的5分钟里,你收到了多少个不同的IP地址(或者你考虑了“在线”超时时间),这是一个简单的例子。

< P>不要使用会话,除非你还需要其他的会话;否则就太过分了

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

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


    在负载平衡或web garden场景中,它会变得稍微复杂一些,但您可以使用相同的基本思想,只需将信息持久化到数据库中,而不是内存中。

    当用户登录时,将其用户名写入HttpContext.Current.Cache,并有一个滑动过期时间(例如20分钟)

    然后在应用程序的Global.asax.cs_prerequesthandler中为当前用户执行“触摸”缓存项,以便重置滑动过期

    当用户显式注销时,将其用户名从HttpContext.Current.Cache中删除

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


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

    你的最佳赌注是随机的。下一个。其他一切都差不多是可靠的。@YuriyFaktorovich,从技术上讲是正确的:)好吧……请原谅我这个愚蠢的问题,但是我如何在不使用数据库的情况下跟踪会话?此应用程序是用.NET 1.1.OP编写的:“这不是基于登录,
    成员身份。GetNumberOfUsersOnline
    基于登录用户。