ASP.NET:这个在线用户计数器出了什么问题?

时间:2012-01-16 02:32:00

标签: asp.net session

我正在尝试计算在线用户的数量。

这是代码:

protected void Application_Start()
{
    ...
    Application["OnlineUsers"] = 0;
}

private void Session_Start(object sender, EventArgs e)
{
            Application.Lock();
            Session["O"] = "OO"; // Need to have something in the session
            Application["OnlineUsers"] = (int)Application["OnlineUsers"] + 1;
            Application.UnLock();
}


private void Session_End(object sender, EventArgs e)
{
            Application.Lock();
            Application["OnlineUsers"] = (int)Application["OnlineUsers"] - 1;
            Application.UnLock();
}

There are <b>@Context.ApplicationInstance.Application["OnlineUsers"].ToString()</b> users online

它有点有用,但我的值总是大于在线用户的实际数量。

更糟糕的是:在Opera刷新页面N次会增加在线用户数量N!

2 个答案:

答案 0 :(得分:4)

这里需要注意的是ASP.NET正在努力为用户存储sessions非常高效。如果ASP.NET没有理由记住您是谁,则不会

当我们第一次请求页面时,将创建会话对象并将其会话标识符发送到Web浏览器,以便浏览器可以在cookie中存储会话标识符(用于请求的标识)。如果再次提交/回发该页面,那么来自cooike的相同会话标识符将可用于app-server,并且它假定这是旧请求。但在您的情况下(您正在引用页面),这意味着Web浏览器会发出新请求(当然请求类型将是GET)而不发送cookie。因此,最好在第一次请求时将用户重定向到特定页面。

即使在该客户端(浏览器)关闭(或结束会话)之后,当会话获取超时(默认值为20分钟)时,将调用Session_End事件句柄。

答案 1 :(得分:1)

我知道它不是你要问的但你可以在IIS上查询PerformanceCounter这个信息

(Razor示例)

@using System.Diagnostics
@{
  var perf = new PerformanceCounter("ASP.NET", "State Server Sessions Active"); 
}
<h2>About</h2>
<p>
   @perf.NextValue()
</p>

我没有检查,但是您的访问可能需要在您的应用池中使用Windows /服务帐户。

您还可以增加和减少自己的性能计数器,并通过用于监控网站等的工具将其提供给系统管理员。

SqlMembershipProvider具有计数登录用户的工具,这意味着如果您使用它来管理表单身份验证,您可能已经拥有数据库。

您还可以考虑让您的网页每隔一段时间发出一次ajax脉冲并计算出来。或者有一些applet,silverlight,flash等做同样的事情。