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();
}

但是当单击按钮时,SessionID 中的值LblSessionID仍然显示旧值,但另一个标签LblIsNewSession会将 IsNewSession 显示为 true。然后LblSessionID,当我使用具有autopostback="true"和从那里 SessionID 存在的 asp.net 控件(如下拉菜单)时,它将反映实际的 SessionID 值。

我确实使用 global.asax

知道为什么LblSessionID没有表现出应有的行为并且正在等待下一次回发以开始反映实际价值吗?

当我启动 Web 应用程序时,问题是相同的 -LblSessionID显示不同的值,然后在第一次回发后更改并从那里保持不变。

4

4 回答 4

2

这就是它的工作方式 - 如果你Abandon在会话中它不会反映,直到下一个请求。如果你仔细想想,它是有道理的......

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

于 2012-11-30T17:59:12.920 回答
0

SessionId 是不可靠的,除非您在会话中实际存储了一些东西(任何东西)。

于 2012-11-30T17:50:48.877 回答
0

尝试

   Session.RemoveAll();

    Session.Clear(); 
于 2012-11-30T17:51:39.533 回答
0

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

Abandon() 方法将会话集合标记为在请求结束时清除,它实际上并没有立即清除它。

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

于 2014-01-31T13:21:18.933 回答