如何在ASP.NET中获得准确的访问者总数

Jon*_*s T 2 c# asp.net c#-2.0

我想知道我网站上的在线访客数量.我做了我的研究,发现了两个解决方案.

来源:ASP.NET中的代码项目
在线活动用户计数器

它易于设置且易于使用,但它也增加了每个Ajax请求/响应的用户数.仅我的主页有12个Ajax请求(对一个页面的8个请求和对另一个页面的4个请求).这大大增加了用户数量.

来源:Stack Overflow Q/A
计算访客数量 这个与前一个完全相同.

来源:ASP.Net论坛 如何使用C#查看"谁在线"

这个看起来比前两个好.以下是此解决方案的详细代码.

void Application_Start(object sender, EventArgs e) 
    {
        // Code that runs on application startup
        HttpContext.Current.Application["visitors_online"] = 0;
    }

void Session_Start(object sender, EventArgs e) 
    {
        Session.Timeout = 20; //'20 minute timeout
        HttpContext.Current.Application.Lock();
        Application["visitors_online"] = Convert.ToInt64(HttpContext.Current.Application["visitors_online"]) + 1;
        HttpContext.Current.Application.UnLock();
    }

void Session_End(object sender, EventArgs e) 
    {
        HttpContext.Current.Application.Lock();
        Application["visitors_online"] = Convert.ToInt64(HttpContext.Current.Application["visitors_online"]) - 1;
        HttpContext.Current.Application.UnLock();
    }
Run Code Online (Sandbox Code Playgroud)

它似乎能够忽略每个Ajax响应的计数增加,但它仍然会增加每个页面刷新或页面请求.

有没有办法计算ASP.Net中准确的在线访问者数量?

Han*_*ing 5

您永远无法获得完全准确的数字:无法(可靠地)检测到用户"已导航到另一个站点"(并离开您的站点)或该用户"关闭了浏览器".

Session_Start/Session_End方式的问题是Session_End仅针对"InProc"会话调用,而不是会话存储在StateServer或SqlServer中.

你可以做什么:

  • 保持Dictionary<string, DateTime>应用程序范围.此存储的session-id(字符串键)与最新访问时间(DateTime值)
  • 对于具有有效会话的每个请求,在字典中查找会话条目并更新它的最新访问时间(如果未找到则添加新条目)
  • 当您想获得在线用户的数量时,首先遍历字典中的所有条目并删除会话超时已经过去的项目.剩余计数是在线用户数.

一个问题(至少):如果一个用户同时使用两个浏览器,他会打开两个会话并计为两倍.如果用户总是登录,也许您可​​以依靠login-id而不是session-id.