如何查找网站上有多少人在线

时间:2009-07-14 18:10:40

标签: asp.net

我必须显示该网站有多少人在线。该站点是使用ASP.NET 2.0开发的。目前我在Global.asax中使用Session start(增加1)和Session End Event(减1)。但是Session_End事件大部分时间没有正确调用。有没有更好的方法来实现这个目标?

4 个答案:

答案 0 :(得分:5)

除非你使用像数据库这样的其他方法,否则你不会在Session_Start中递增并在Session_End中递减得更好。

当您对请求进行身份验证时,您可以更新数据库中的时间戳以显示用户已处于活动状态,并且在给定时间(例如15分钟)之后,收集并发用户数的查询将忽略该行数据库(从而递减计数)。

答案 1 :(得分:4)

快速Google搜索显示handy way of doing this带有HttpModule。

总而言之,Yohann做得很好。它确实实现了上面建议的设置超时,但是除了检查服务器的perfmon.exe并检查WebService>>之外,没有设置方法可以准确地执行此操作。 WebAppPool的当前连接数。

当我自己实现这个时,我使用SQL Server表来存储身份验证的日期/时间和用户信息。每当我必须刷新数据缓存(每10分钟一次)时,我通过重新评估和匹配IP地址来减少计数。

答案 2 :(得分:3)

我们在一个项目中遇到同样的问题,在尝试了几种方法之后,我们以跟踪每个用户的空闲时间结束,当空闲时间超过会话超时时,我们认为用户不再在线。当然你还需要考虑另一个问题,比如用户注销,或者在超时后重新登录......

答案 3 :(得分:3)

之前我已经完成了这项工作,并且可以证明只有手动销毁会话(Session.Abandon)才会调用Session_End。当你考虑它时,它是有道理的。如果用户不在网站上,则代码永远不会被执行。

我所做的是将一个哈希表存储在应用程序状态中,该状态包含上次在站点上看到用户的用户名和日期时间。对于每个页面加载,我将调用一个函数,该函数将为当前用户插入或更新此值。然后它会剔除整个列表并删除所有早于会话超时的条目(20分钟或其他)。在更改此列表时,请记住使用锁定或同步以避免竞争条件。

这样做的另一个好处是,不仅可以了解有多少人,还可以了解哪些用户。

如果您没有像Username这样的独特内容,则可以使用Session.SessionID。它应该是您网站的每位访问者唯一的。

但是要小心,使用应用程序或应用程序实例状态变量有其自己的问题,因为它不会在“Web Garden模式”或多服务器设置中的进程之间共享。您需要更持久的介质,例如数据库或分布式缓存,以进行更大规模的设置。