【问题标题】:How can I view everything in Session State for all active Sessions?如何查看所有活动会话的会话状态中的所有内容?
【发布时间】:2012-11-05 02:50:37
【问题描述】:

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

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

【问题讨论】:

    标签: asp.net session-state


    【解决方案1】:

    免责声明:我只是想出了这个实现,因为我认为这是一个有趣且可解决的问题。因此,我可能忽略了一些问题或细节。不过,如果您使用的是 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
    ----
    

    【讨论】:

    • 所以,基本上,您所做的是实现您自己的会话服务器;)正如您所说,这将适用于 InProc 会话 - 如果您不使用 InProc,则不会调用 Session_End ,但是您将所有会话数据存储在数据库中,因此您可以轻松地从那里读取它;)
    【解决方案2】:

    无法从另一个会话访问会话。但是,通过实现成员资格提供程序,您可以知道会话是否处于活动状态以及有关用户活动的许多其他有用信息。此外,通过使用数据库持久化会话状态,您可以检索所需的信息。

    您可以使用“活动”标志在数据库中存储/删除会话,以获取更具可扩展性的解决方案,以防万一这对您很重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-10
      • 1970-01-01
      • 1970-01-01
      • 2017-12-10
      • 2010-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多