在ASP.Net中获取会话ID

时间:2009-04-14 05:51:15

标签: asp.net

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

6 个答案:

答案 0 :(得分:51)

要获取会话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示例由猴子编写。

答案 1 :(得分:5)

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

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

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

然后在您的WebForm中,您可以获得会话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

答案 2 :(得分:3)

根据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);
    }
}

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

如果您想要一种存储控制后备存储的当前会话列表的方法,以便您可以存储有关客户端的额外数据,则可以使用列表。 (我从头顶写下面的例子)

挂钩到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。