2012-01-16 46 views
3

我在嘗試計算在線用戶的數量。ASP.NET:這個在線用戶計數器有什麼問題?

這是代碼:

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

可能是cookie設置在opera中被禁用。 – adatapost 2012-01-16 03:01:56

回答

4

這裏很重要的一點是,ASP.NET正試圖爲用戶存儲sessions非常高效。如果ASP.NET沒有理由記住你是誰,它不會

當我們請求頁面第一次,會話對象將被創建,其會話標識符將被髮送到web瀏覽器,以便瀏覽器可以存儲在cookie的會話標識符(對於請求identiity)。如果該頁面再次被提交/回發,則來自cooike的相同會話標識符將可用於應用服務器,並且它假定這是舊請求。但在你的情況下(你正在重新頁面),這意味着web瀏覽器發出新的請求(當然請求類型將爲GET)而不發送cookie。因此,最好在首次請求時將用戶重定向到特定頁面。

即使在客戶端(瀏覽器)關閉(或結束會話)之後,當Session獲取超時(默認值爲20分鐘)時,將調用Session_End事件句柄。

+0

謝謝你的詳細解答。但我仍然不明白我需要做什麼來解決問題。重定向到特定頁面?它應該處理什麼?我知道會話超時,我已經將它設置爲10分鐘,但它看起來像Session_End中的事件被稱爲後期大量的比需要。 – Alex 2012-01-17 05:35:48

1

我知道它不太你問什麼,但你可以查詢的PerformanceCounter上IIS,此信息

(剃刀例)

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

我沒有檢查,但你的這種訪問可能需要在您的應用程序池中有一個Windows/Service帳戶。

您還可以遞增和遞減你自己的性能計數器,並讓他們提供給系統管理員通過它們監測網站等工具

的SqlMembershipProvider的具有計數登錄用戶的設施,這將意味着你如果您正在使用它來管理表單身份驗證,則可能已將數據放在數據庫中。

您也可以考慮讓你的網頁發出AJAX脈衝每一個「的時間段」,並數着。或者有一些applet,silverlight,flash等等。