ASP.NET会话ID不会更新。

3

我点击了刷新按钮,这应该重新启动会话:

protected void btnRefresh_Click(object sender, EventArgs e)
{

    HttpContext.Current.Session.Abandon();
    HttpCookie mycookie = new HttpCookie("ASP.NET_SessionId");
    mycookie.Expires = DateTime.Now.AddDays(-1);
    Response.Cookies.Add(mycookie);
    LblSessionID.Text = HttpContext.Current.Session.SessionID+
        " test btnRefresh_Click";
    LblIsNewSession.Text = Session.IsNewSession.ToString();
}

但是当按钮被点击时,LblSessionID 中的 SessionID 值仍显示旧值,但另一个标签 LblIsNewSession 将显示为 IsNewSession 的 true。只有当我使用具有 autopostback="true" 的 asp.net 控件(如下拉框)时,LblSessionID 才会反映出实际的 SessionID 值,从那里开始 SessionID 保持不变。
我确实使用了 global.asax。
有任何想法为什么 LblSessionID 表现不正常,并等待下一次 postback 才开始反映实际值?
当我启动 Web 应用程序时,问题是相同的-LblSessionID 显示不同的值,然后在第一次 postback 后更改并保持不变。

会话ID(SessionID)会被重复使用,通常你会反复获得相同的ID。 - CM Kanode
使用global.asax的session_end事件。 - CodeSpread
4个回答

2

这就是它的工作原理 - 如果您放弃了会话,直到下一个请求它才会反映出来。如果您思考一下,这是有道理的...

假设您有一个用户访问您的网站,并获得了一个会话ID为123(我知道这不是实际值)。当您单击按钮以获取新的会话ID时,用户的请求来自旧会话,并且在该Request期间反映的是该值。一旦会话被重置(或放弃或其他),用户将获得一个新的会话ID321,随后的Request将反映出该新的会话ID。


谢谢。你的回答非常有道理。虽然我仍然不确定我的代码哪里出了问题。这段代码没有发送请求,需要添加什么呢? - Darcy Q

0

尝试

   Session.RemoveAll();

    Session.Clear(); 

这并没有太大帮助 - 它只会从会话中删除所有内容,但不会更改此请求的ID。 - Alexei Levenkov
不,它们不会启动新的SessionID,它们只是清除会话值。 - Darcy Q

0

除非您在会话中实际存储了某些内容(任何内容),否则SessionId不可靠。


0

这不是你的代码问题,而是一个已记录的行为: "Abandon方法在会话状态对象中设置一个标志,指示应该放弃会话状态。该标志在页面请求结束时被检查。因此,在调用Abandon方法后,用户仍然可以使用会话对象。一旦页面处理完成,会话将被删除。" (来源:http://support.microsoft.com/kb/899918)

Abandon()方法标记会话集合以在请求结束时进行清除,但实际上并不立即清除它。

您可以调用RemoveAll()或Clear()方法以立即删除对象,或者向页面本身发出Response.Redirect调用并重新测试数据的存在性。


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