我正在尝试计算在线用户的数量。
这是代码:
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!
答案 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等做同样的事情。