我想创建一个管理页面,以表明我们对会话状态的使用并没有失控。
是否可以检索所有活动会话的列表,如果可以,我如何访问每个会话中的所有会话数据?
答案 0 :(得分: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 ----
答案 1 :(得分:0)
会话无法从另一个会话访问。但是,通过实现成员资格提供程序,您可以了解会话是否处于活动状态以及有关用户活动的许多其他有用信息此外,通过使用DB持久保存会话状态,您可以检索所需的信息。
您可以使用“active”标志来存储/删除数据库中的会话,以获得更具伸缩性的解决方案,以防对您来说很重要。