2009-11-30 50 views
5

我有一個要求,即我的網站始終顯示當前在線用戶的數量。例如,「35741用戶目前在線」。這不是基於登錄,只是我的網站上有多少用戶。我曾嘗試使用會話開始/會話結束,但會話結束並不可靠。因此,我收到虛增的數字,因爲我的會話開始添加數字,但會話結束時不會刪除它們,因爲它不會觸發。跟蹤當前在線用戶的最佳方式

沒有其他信息可以從這個(報告等)中收集到,只需要顯示該號碼即可。非常簡單的要求變成了一筆鉅額交易。任何幫助表示讚賞。

編輯:

我應該指出,我也嘗試使用這個數據庫。包含會話ID和最後一個活動列的簡單表格。每打一頁,我都會查看會話是否在我的數據庫中。如果沒有,插入。如果是這樣,請更新活動時間。然後我運行一個掃描數據庫的過程,在過去的20分鐘內查找沒有活動的會話。這種方法似乎殺死了我的SQL服務器和/或IIS。必須重新啓動該網站。

+2

你最好的選擇是Random.Next。其他一切都是可靠的。 – 2009-11-30 22:42:58

+0

@YuriyFaktorovich,技術上是真的:) – 2011-12-26 16:03:32

回答

8

最好的方法就像你一樣,但通過活動時間。如果某個會話在5分鐘左右內沒有訪問某個頁面,則可能會認爲它們不再處於活動狀態。

+2

+1 \t我寫的是同樣的東西 – 2009-11-30 22:42:55

+0

正如我要打的輸入... – Dave 2009-11-30 22:43:10

+0

我的確寫了同樣的東西! – Larsenal 2009-11-30 22:43:11

2

對於您可以錄製的每個用戶操作,您需要將它們視爲「在線」,以便在特定時間段內進行操作。根據網站的情況,您可以將其設置爲5分鐘。實際的網絡請求應該不到一秒鐘。你必須假設有些假設他們可能停留在該頁面上多長時間,並且什麼也不做,只能在網上考慮。

這種方法要求您跟蹤每個用戶上次活動的時間。

3

如果您使用ASP.Net會員,看看GetNumberOfUsersOnline

+0

OP:「這是不是**基於登錄」,「Membership.GetNumberOfUsersOnline」基於登錄用戶。 – 2013-09-14 06:39:59

0

在他的回答中擴展了什麼柔滑 - 因爲確實http是無狀態的以確定用戶目前是否在線,您只能追蹤用戶上次訪問網站的時間,並確定請求之間的時間長短你的考慮仍然是積極的。

既然你聲明這不是基於用戶登錄可能是一個簡單的多少個不同的IP地址你在過去5分鐘內收到的請求(或者你認爲'在線'超時是多長時間) 。

0

不要爲此使用會話,除非您還需要其他的會話;否則它是過度的。

假設一個單一服務器安裝,做這樣的事情:

  1. 對於每個用戶,發出包含一個唯一的ID
  2. 保持唯一ID的靜態表和它們的最後訪問時間
  3. 一個cookie
  4. 在HttpModule(或Global.asax)中,向表中輸入新用戶並更新其訪問時間(使用適當的鎖定來防止競爭條件)
  5. 定期從後臺線程或內聯用戶請求,從表格中刪除條目在過去的N分鐘內沒有提出請求。您可能還想要支持顯式的「註銷」功能。
  6. 報告的人上網人數爲表

如果你使用會話,您可以使用Session ID作爲唯一標識符的大小。但是,請記住,除非您配置了Session_Start()事件,否則只有在會話字典中存儲了某些內容之後纔會發佈會話ID。

在一個負載平衡或網絡花園場景中,它會變得稍微複雜一些,但是您可以使用相同的基本思想,只需將信息保存在數據庫中而不是內存中。

0

當用戶登錄時,將他的用戶名寫入HttpContext.Current.Cache並且滑動過期(例如20分鐘)。

然後在Application.preRequestHandlerExecute中的Global.asax.cs中「觸摸」當前用戶的緩存條目,以便重置滑動過期。

當用戶明確登出時,從HttpContext.Current.Cache中刪除他的用戶名。

如果你這樣做,在任何給定的時間HttpContext.Current.Cache.Count會給你當前用戶的#。

注意:這是假設您沒有將Cache用於其他目的。

相關問題