2009-08-28 18 views

回答

4

聲明:我只是想出了這個實現,因爲我認爲這是一個有趣的和可解決的問題。因此,可能存在一些我忽略考慮的問題或細節。儘管如此,如果您使用InProc會話狀態,這裏有一個解決方案。

摘要:創建在Application_Start事件期間創建的以應用程序狀態存儲的應用程序級對象(例如,列表),並在每個Session_Start事件中爲該列表添加對該會話的引用。在Session_End上,將其刪除。要檢索所有活動會話和值,請循環訪問會話列表,然後遍歷每個會話的會話密鑰。

的Global.asax

void Application_Start(object sender, EventArgs e) 
{ 
    Application["activeSessions"] = new System.Collections.Generic.List<HttpSessionState>(); 
} 

void Session_Start(object sender, EventArgs e) 
{ 
    var activeSessions = (System.Collections.Generic.List<HttpSessionState>)Application["activeSessions"]; 
    activeSessions.Add(this.Session); 
} 

void Session_End(object sender, EventArgs e) 
{ 
    var activeSessions = (System.Collections.Generic.List<HttpSessionState>)Application["activeSessions"]; 
    activeSessions.Remove(this.Session); 
} 

SomePage.aspx頁面

//add something to session for test 
    this.Session["someStr"] = DateTime.Now.ToString(); 

    //get sessions 
    var activeSessions = (List<HttpSessionState>)Application["activeSessions"]; 
    foreach (var session in activeSessions) 
    { 
     Response.Write("Session " + session.SessionID + "<br/>"); 
     foreach (string key in session.Keys) 
     { 
      Response.Write(key + " : " + session[key] + "<br/>"); 
     } 
     Response.Write("<hr/>"); 
    } 

輸出:(後裝載了第二個瀏覽器擊中頁)

Session sj0sa255uizwlu45zivyfg2m 
someStr : 8/28/2009 11:03:37 AM 
---- 
Session 530b3sjtea22jm451p15u355 
someStr : 8/28/2009 11:03:43 AM 
---- 
+0

所以,基本上,你所做的是實現你自己的會話服務器;)如你所說,這將適用於InProc會話 - 如果你不使用InProc,那麼Session_End不會被調用,但是你將所有會話數據存儲在數據庫中,這樣您就可以輕鬆地從這裏讀取它;) – 2009-08-28 15:47:20

0

會話不能從另一個會話訪問。但是,通過實施會員提供商,您可以知道會話是否處於活動狀態以及有關用戶活動的許多其他有用信息。通過使用數據庫持久化會話狀態,您可以檢索所需的信息。

您可以使用「活動」標誌來存儲/刪除數據庫中的會話,以獲得更具擴展性的解決方案,以防萬一您的重要。

相關問題