[英]ASP.NET: what's wrong with this online users counter?
我正在嘗試計算在線用戶的數量。
這是代碼:
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的在線用戶數量!
這里需要注意的是, ASP.NET正在努力為用戶存儲sessions
。 如果ASP.NET
沒有理由記住你是誰,那就不會 。
當我們第一次請求頁面時,將創建會話對象並將其會話標識符發送到Web瀏覽器,以便瀏覽器可以在cookie中存儲會話標識符(用於請求的標識)。 如果再次提交/回發該頁面,那么來自cooike的相同會話標識符將可用於app-server,並且它假定這是舊請求。 但在您的情況下(您正在引用頁面),這意味着Web瀏覽器會發出新請求(當然請求類型將是GET)而不發送cookie。 因此,最好在第一次請求時將用戶重定向到特定頁面。
即使客戶端(瀏覽器)關閉(或結束會話),Session會在超時(默認值為20分鍾)時調用Session_End
事件句柄。
我知道它不是你要問的但你可以在IIS上查詢PerformanceCounter以獲取此信息
(剃刀示例)
@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等做同樣的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.