2010-08-13 82 views
5

我將如何跟蹤我網站上當前會話的數量?現在跟蹤誰在網站上

+5

部分取決於您對活動的定義。我們可能正在討論當前會話次數,或上個月登錄或X-days內實際貢獻者。請提供更多關於您想要衡量的內容的信息。 – kbrimington 2010-08-13 14:27:12

回答

2

如果你只是想知道誰在通過一個小小的rinky-dink網站上的頁面進行查看,一種方法是擁有最新請求的應用程序範圍(或靜態)列表以及請求的日期/時間。每當有人請求一個頁面時,刪除所有「舊」點擊(大於X分鐘),並附加(或更新)訪問者的信息,現在的日期/時間,

請注意,對於真正繁忙的網站,這可能是一個壞主意。一個更具可擴展性的解決方案是在用戶表中創建一個「上次訪問」列,並在用戶請求頁面時進行更新。但是這對跟蹤匿名/未登錄的用戶無效。無論哪種方式,要查看誰是「活躍」,可以瀏覽數據並找到上次訪問時間少於X分鐘前的所有訪問/用戶,其中X是您認爲合適的某個數字。 20-60分鐘通常足夠好。

0

一個非常簡單的方法是跟蹤每個用戶的最後一次活動。經過一段時間沒有活動,你說這個用戶不再活躍。

0

一種簡單的方法是編寫一個小的http模塊(或者甚至利用global.asax)來管理何時創建會話,何時會話結束以更新所有當前活動用戶的集合或數據庫表以及當會話結束時刪除記錄。

RE:會話結束後,你仍可以正常訪問會話本身或從任何發件人財產或財產EventArgs的最起碼的會話標識符。這將爲您提供一種使用會話標識符將asp.net會話關聯到用戶的簡單方法。您可以通過在調試中啓動應用程序並在即時窗口中執行Session.Abandon()輕鬆地進行測試。以編程方式觸發此事件,以便您可以使用可以調試的實時代碼來查看它。

注意我並不是100%確定使用sender/args,但是你應該能夠直接在global.asax SessionEnd中訪問會話本身,只要這樣做。Session仍然可用(確保不使用HttpContext.Current.Session,因爲上下文不存在)。

+0

試過了,它不能很好地工作。當會話以超時結束時,會話結束後您將獲得會話結束事件,因此您不知道哪個會話結束。 – 2010-08-13 15:39:08

0

有一兩件事你可以做的是實現自己的SessionStateStoreProviderhttp://msdn.microsoft.com/en-us/library/ms178587.aspx

在你執行的GetItem的,你會更新自己的當前會話數據,並在您的removeItem實現集合,你可以訪問ASP .NET會話數據,因此您可以在以常規方式刪除ASP.NET會話之前從您的集合中刪除該項目。您可以查詢您的集合以查看當前活動的會話。

RemoveItem

或者:

Create Procedure dbo.GetCurrentUsers 
@ActiveSince DateTime 
AS 
    SELECT U.UserId, U.UserName, M.Email 
    FROM aspnet_Users U 
    INNER JOIN aspnet_membership M ON M.UserId = U.UserId 
    WHERE U.LastActivityDate > @ActiveSince 
GO 

你會設置:

如果您使用的是ASP.NET成員資格提供,你可以沿着東西線查詢數據庫@ActiveSince是當前的DateTime減去您的網站上的會話超時。

var sessionState = (System.Web.Configuration.SessionStateSection) 
       ConfigurationManager.GetSection("system.web/sessionState"); 
DateTime activeSince = DateTime.Now.AddMinutes(0 - sessionState.Timeout.TotalMinutes); 

這將包括誰擁有了你的網站,然後用戶留下直線距離,但沒有告訴他們是否仍然存在,除非你有你的網頁上的腳本,定期發送Ajax調用的方式到服務器說它仍然是開放的。我會建議不要這樣做,因爲它會增加流量,並且浪費資源而沒有真正的收益。

0

我會在Global.asax中處理這個問題。將Session_Start添加到包含要跟蹤的數據的應用程序全局列表(即User,SessionId,StartTime,LastRequestTime)。

當用戶第一次訪問該站點時,Session_Start將向GlobalList添加一個條目。這將確保每個獨特的用戶都獲得它自己的條目(處理令人討厭)。如果你願意,一旦用戶登錄,你可以更新GlobalList來設置用戶信息(姓名,ID等等)。

接下來,讓Application_Start啓動一個後臺線程,通過全局列表並刪除任何過期的項目(根據您設置的任何閾值,LastRequestTime-StartTime的TimeSpan)。

如果你想在WebFarm場景中部署它,那麼你必須將列表移動到你的數據庫。