在ASP.Net中获取会话ID

38

如何获取所有当前会话的ID?

6个回答

66

获取会话ID,可以这样做:

// In a user control or page
string sessionId = this.Session.SessionID; 

// In a normal class, running in a asp.net app.
string sessionId = System.Web.HttpContext.Current.Session.SessionID; 

您不需要:

  • 创建任何数据表或循环任何内容
  • 将SQL Server用于会话状态
  • 处理Session_Start或Session_End

在无Cookie的情况下,当您首次访问Session对象时,会创建会话ID。这不应该太重要,因为一旦访问SessionID属性,会话对象就被访问了。

欲了解更多信息,请参阅:

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.sessionid.aspx

注意:msdn上的示例是由猴子编写的。


6

您可以使用Global.asax文件并在Session_Start事件中设置会话。请参见以下内容

Global.asax文件中,您可以执行以下操作:

protected void Session_Start(object sender, EventArgs e)
{
    Session["sid"] = Session.SessionID;
    Session["sid"] = "Test";
} 

然后在您的Web表单中,您可以像下面这样获取Session ID和值:

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write("Session ID is:" + Session.SessionID.ToString()+ "<br/>");
    Response.Write("Session value is:" + Session["sid"].ToString());
} 

具体详情请参见http://www.dotnetcurry.com/ShowArticle.aspx?ID=126


4
根据Dino Esposito的说法,每个会话都存储在应用程序的缓存中,通过一些工作,您可以检索这些信息:
DataTable dt = new DataTable();
dt.Columns.Add("SessionID", typeof(string));
foreach(DictionaryEntry elem in Cache) {
    string s = elem.Key.ToString();
    if (s.StartsWith("System.Web.SessionState.SessionStateItem")) {
        DataRow row = dt.NewRow();
        char[] parms = {':'};
        string[] a = s.Split(parms);
        row["SessionID"] = a[1];
        dt.Rows.Add(row);
    }
}

2
适用于 asp.net 4.5.1 吗? - PreguntonCojoneroCabrón
刚刚尝试了一下,.NET Framework 4.8在“Cache”中没有这样的密钥。 - mybrave

1
如果你需要一种方式来存储当前会话的列表,并且你可以控制后端数据存储,以便可以存储有关客户端的额外数据,那么可以使用一个列表。(我从脑海中编写了以下示例)
在global.asax.cs文件中的Application_SessionStart中添加钩子:
static List<string> sessions = new List<string>();
static object sessionLock = new object();

void Application_SessionStart()
{
    lock (sessionLock) {
        sessions.Add(Session.SessionID);
    }
}

void Application_SessionEnd()
{
    lock (sessionLock) {
        sessions.Remove(Session.SessionID);
    }
}

您也可以使用词典,将会话ID存储为键,该用户的额外数据存储为值。然后,您可以轻松地创建一个页面,显示所有当前用户会话,例如,用于管理员网站显示当前用户会话。

仅当您的会话为InProc时,才会调用SessionEnd。


1
不错的插件答案 - vibs2006

0

答案部分取决于您存储会话状态的位置。假设您使用默认设置(inproc),则可以使用global.asax中的Session_StartSession_End事件维护当前会话ID列表。


0
如果您将会话状态存储在 SQL Server 中,您也可以轻松地从那里获取它。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接