2014-01-10 183 views
0

我想顯示登錄用戶數在我的頁面中。我使用應用程序變量實現了這個功能,但問題在於用戶關閉瀏覽器時不會減少計數。ASP.NET獲得登錄用戶數登錄用戶

首先我打開IE瀏覽器使用的計數變成1 Web應用程序,然後我打開Firefox的使用計數變成了2應用程序時,我關閉數沒有得到減少瀏覽器中的任何一個。

void Application_Start(object sender, EventArgs e) 
{ 
     Application["UsersCount"] = 0; 
} 

void Application_End(object sender, EventArgs e) 
{ 
} 

void Session_Start(object sender, EventArgs e) 
{ 
    if (Application["UsersCount"] != null) 
    { 
     Application.Lock(); 
     Application["UsersCount"] = ((int)Application["UsersCount"]) + 1; 
     Application.UnLock(); 
    } 
} 
void Session_End(object sender, EventArgs e) 
{ 
     Application.Lock(); 
     Application["UsersCount"] = ((int)Application["UsersCount"]) - 1; 
     Application.UnLock(); 
} 

有沒有其他辦法可以達到這個目的呢?

謝謝。

+0

'只有Session_End'火災時,會話超時在服務器上(瀏覽器不會發送有關信息結束),然後只有當你在使用'InProc'會話狀態。 –

+0

是的,有沒有其他方法來統計訪問應用程序的用戶? – watraplion

+0

如果您正在使用會話您正在使用什麼會話狀態存儲? 'InProc','StateServer'或'SQLServer'? –

回答

0

這不是那麼容易實現。要成爲登錄實際上並不意味着用戶在做某事。你應該設置一些超時(可能與auth cookie的生命週期相同)並檢查每個用戶的最後一個活動標記。特別DB表是適合這種模式,但如果你想快速和骯髒的解決方案:

你可以保持IDictionary<Guid, DateTime>您在每次請求更新。 Guid用於UserID,DateTime用於上一次活動。在每個請求中(可能在後面的MasterPage代碼中的某處),您使用當前DateTime更新此字典。然後,您可以檢查日期時間少於超時的ID的計數。

IDictionary<Guid, DateTime> userActivityLog = Application["UserActivityLog"] as IDictionary<Guid, DateTime>; 
DateTime timeout = DateTime.Now.AddHours(-1); // one hour timeout 
int loggedCount = userActivityLog.Count(x => x.Value > timeout); 
+0

謝謝@Dzoukr,不幸的是,如果用戶打開的第n頁夫婦分鐘內關閉它,它仍然會展示自己的計數,直到1小時權。 – watraplion

+0

是的......實際上沒有辦法找到,他們不在那裏(吃活動會話的午餐:))。瀏覽器關閉時可能會添加一些AJAX調用,但仍然不準確。也許,如果你認爲每分鐘一次「點擊」你的網站是正常的,你可以將超時設置爲幾分鐘。另一方面,不活動的幾分鐘並不意味着用戶關閉了瀏覽器 - 可以填寫一些長表格左右。如上所述,這不是一件容易的事。 – Dzoukr

+0

yupp反正謝謝@Dzoukr :) – watraplion