我要求我的网站始终显示当前在线的用户数。例如,“35741用户当前在线”。这不是基于登录,只是我的网站上当前有多少用户。我已尝试使用Session Start / Session End,但会话结束不可靠。因此,当我的会话开始添加数字但是会话结束时不会删除它们,因为它不会触发,我会得到数字膨胀。
没有从此收集的其他信息(报告等),只是要求显示该号码。非常简单的请求变成了一个巨大的交易。任何帮助表示赞赏。
编辑:
我应该指明我也尝试过使用数据库。包含会话ID和最后一个活动列的简单表。每次点击页面,我都会检查会话是否在我的数据库中。如果没有,请插入。如果是,请使用活动时间进行更新。然后我运行一个扫描数据库的过程,在过去20分钟内查找没有活动的会话。这种方法似乎会破坏我的SQL服务器和/或IIS。不得不重启网站。
答案 0 :(得分:8)
最好的方式就像你一样,但是通过活动来计时。如果给定的会话在5分钟左右的时间内没有访问某个页面,您可能会认为它们不再处于活动状态。
答案 1 :(得分:3)
如果您使用的是ASP.Net会员资格,请查看GetNumberOfUsersOnline。
答案 2 :(得分:2)
对于您可以记录的每个用户操作,您需要在某个时间窗口“在线”考虑它们。根据站点的不同,您可以将其设置为5分钟。实际的Web请求应该不到一秒钟。你必须做出一些的假设,假设他们可以留在该页面上多长时间,除了被认为是在线之外什么都不做。
此方法要求您跟踪每个用户上次活动的时间。
答案 3 :(得分:2)
- 状态服务器会话有效: 活跃用户会话数。
答案 4 :(得分:0)
扩展silky在他的回答中所说的内容 - 因为http确定无用状态以确定用户当前是否“在线”,您实际上只能跟踪用户上次访问您网站的时间,并确定请求之间的时间长度考虑仍然活跃。
由于您声明这不是基于登录的用户,可能是您在过去5分钟内收到多少个不同IP地址的简单(或者您认为“在线”超时时间有多长)。
答案 5 :(得分:0)
除非您还需要其他会话,否则不要使用会话;否则就太过分了。
假设安装了单服务器,请执行以下操作:
如果您使用会话,则可以使用会话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用于其他目的。