在ASP.NET中丢失会话数据

时间:2013-11-09 00:55:34

标签: c# asp.net session

我将运行在.NET 1.1服务器上的ASP.NET站点移动到另一台运行.NET 2.0的服务器上。

在其中一个页面中,我有以下代码来检测过期的会话:

  protected void Page_Init(object sender, System.EventArgs e) {  

    if ( Session["XBCPEmail"] == null ) {
      Response.Redirect("signin.aspx?expired=yes");
      return;
    }
  }

(会话[“XBCPEmail”] == null)在单击其中一个按钮后,在一个意外情况下解析为true(就像会话已过期一样)。它只发生在其中一个按钮上。就像同一页面中的其他按钮一样,按钮事件处理程序以此代码重定向到同一页面结束:

Response.Redirect("cpanel.aspx"); 

我检查过Response.Redirect("cpanel.aspx");(string)Session["XBCPEmail"]的值是有效字符串,所以我不确定Response.Redirect和{{1}之间会发生什么这可能会使Page_Init变为空。

哪个可以使.NET 2.0中的Session变量变为空?此代码在1.1中没有该问题,即使在2.0中,它也仅影响页面上的一个按钮。

更新:仅当按钮事件处理程序使用下面的代码调用外部.exe程序时才会出现此问题。如果注释掉此代码,则Session变量不为null。如果Session变量为null,创建运行命令行程序的外部进程有什么影响呢?

Session["XBCPEmail"]

更新2 :在使用IIS 7.5计算机的Windows 2008 R2上安装.NET 4.5后,问题已经消失,而不是使用默认情况下使用的那个,即.NET 2.0。

9 个答案:

答案 0 :(得分:9)

默认情况下Response.Redirect终止线程执行,并且在设置会话变量时可能存在竞争条件。它在文章Don't redirect after setting a Session variable (or do it right)中有所描述,因此请尝试使用另一个不那么暴力的版本:

Response.Redirect("cpanel.aspx", false); 

答案 1 :(得分:7)

检查你的web.config,也许你有这个标签

<httpCookies requireSSL="true" />

如果是这样,请将其删除。

答案 2 :(得分:1)

我相信您正在重置web.config中的会话(为每个回发获取一个新的SessionID)

您可以尝试使用

将SessionID放在页面上的某个位置(用于测试)来调试此操作
HttpContext.Current.Session.SessionID

这确实发生在我的一个网站上,我所要做的就是进入IIS并重新启动SessionState面板

答案 3 :(得分:1)

在重定向之前设置Session变量时遇到此问题。我在Web.config中有 enableSessionState =&#34; ReadOnly&#34; 。这是因为会话不存在,并且重定向发生在客户端可以设置会话cookie之前。

我的解决方案是在上一页加载中设置一个虚拟Session变量(在我的情况下是登录页面)。

protected void Page_Load(object sender, EventArgs e)
{
    // Put this in master page or login page
    Session["createSession"] = true; /* ensure there's a cookie for session */
}

答案 4 :(得分:1)

我遇到了同样的问题,并尝试了上述答案中提到的每个选项。 最终发现问题是我们在项目中将会话cookie标记为安全,但正在使用http运行它 如果尚未为SSL设置服务器,并且您尝试将cookie标记为安全,则将为每个请求生成一个新会话。 所以最后启用back https为我修复了它。

答案 5 :(得分:0)

您需要更新web.config,如下所述:

<httpCookies requireSSL="false" />

答案 6 :(得分:0)

只需转到您的web.config文件并编辑您的sessionstate标记即可。将requiressl设置为false为true。

答案 7 :(得分:0)

<httpCookies requireSSL="false" />

从本地web.config中删除它对我有用。问题只发生在本地运行应用程序时。

  • 从web.config
  • 中删除了该设置
  • 将其添加到web.staging.config和web.production.config

答案 8 :(得分:0)

对于MVC,请确保web.config具有以下配置。

<httpCookies httpOnlyCookies="true" requireSSL="false" />

<system.web>部分