如何查看所有活动会话的会话状态中的所有内容?

Bob*_*Bob 5 asp.net session-state

我想创建一个管理页面来表明我们对会话状态的使用没有失控。

是否可以检索所有活动会话的列表,如果可以,我如何访问每个会话中的所有会话数据?

Kur*_*ler 4

免责声明:我只是想出了这个实现,因为我认为这是一个有趣且可解决的问题。因此,可能有一些问题或细节我忽略了考虑。不过,如果您使用InProc会话状态,这里有一个解决方案。

摘要:创建一个应用程序级对象(例如列表),该对象存储在事件期间创建的应用程序状态中Application_Start,并在每个Session_Start事件上将会话的引用添加到列表中。打开Session_End,将其删除。要检索所有活动会话和值,请循环遍历会话列表,然后遍历每个会话的密钥。

全局.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);
}
Run Code Online (Sandbox Code Playgroud)

某页.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/>");
    }
Run Code Online (Sandbox Code Playgroud)

输出:(加载第二个浏览器以访问该页面后)

Session sj0sa255uizwlu45zivyfg2m 
someStr : 8/28/2009 11:03:37 AM
----
Session 530b3sjtea22jm451p15u355 
someStr : 8/28/2009 11:03:43 AM
----
Run Code Online (Sandbox Code Playgroud)