【问题标题】:Losing session data in ASP.NET在 ASP.NET 中丢失会话数据
【发布时间】:2013-11-09 00:55:34
【问题描述】:

我将一个运行在 .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;
    }
  }

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

Response.Redirect("cpanel.aspx"); 

我检查了Response.Redirect("cpanel.aspx"); 时(string)Session["XBCPEmail"] 的值是一个有效的字符串,所以我不确定Response.Redirect 和Page_Init 之间会发生什么可能导致@987654327 @ 变为空。

这会使 .NET 2.0 中的 Session 变量变为空?这段代码在 1.1 中没有这个问题,即使在 2.0 中,它也只会影响页面上的一个按钮。

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

private string CallBridge3(string task, string arg1, string arg2, string arg3) {

    Process process = new Process();

    process.StartInfo.FileName = MapPath("bridgefcp.exe");
    process.StartInfo.Arguments = "-" + task + " \"" + arg1 + "\" \"" + arg2 + "\" \"" + arg3 + "\"";
    process.StartInfo.RedirectStandardOutput = true;
    process.StartInfo.UseShellExecute = false;

    process.Start();

    string output = process.StandardOutput.ReadToEnd();
    process.WaitForExit();
    return output;
  }  

更新 2:在装有 IIS 7.5 的 Windows 2008 R2 机器上安装 .NET 4.5 后问题消失了,而不是使用默认的 .NET 2.0。

【问题讨论】:

    标签: c# asp.net session


    【解决方案1】:

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

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

    【讨论】:

    • 您几乎应该始终将 false 作为 Response.Redirect 的第二个参数。
    • 添加第二个参数为 false 似乎并不能解决问题。此按钮与其他工作按钮之间的一个区别是,在 Response.Redirect 之前,会创建一个外部进程几次来运行 .exe 文件。我刚刚在原始问题的末尾添加了一些附加代码来显示此代码。
    • 我追查了这个问题,当且仅当在事件处理程序期间调用 CallBridge3 至少发生一次时才会发生此问题。如果创建并等待外部进程,Session 信息在回发时会受到怎样的影响?
    • 这真的很有趣。我什至试图重现它,但没有成功。这发生在您的所有 Session 值上,还是仅发生在 XBCPEmail 上?您的会话状态在 web.config 中是如何配置的?什么时候设置 XBCPEmail 值?是否有任何地方将其设置为 null?
    • 安装 .NET 4.5(而不是使用带有 IIS 7.5 的 Windows 2008 R3 附带的 .NET 2.0)时问题已消失
    【解决方案2】:

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

    <httpCookies requireSSL="true" />
    

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

    【讨论】:

    • 为什么那个元素会引起问题?我需要它将secure 标志放在 ASP.NET 会话 cookie 上。
    • 我遇到了丢失会话的问题,但它在 mi 本地计算机上。在服务器上一切正常。取消这个点头对我有帮助。
    • 我发现拥有这个元素只会导致会话数据丢失,当请求的页面不是通过 https 请求时(因此“需要 SSL”)。我相信我在内部读到过,在设置会话 cookie 之前有一个 Assert(Request.IsSecure)。
    【解决方案3】:

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

    <httpCookies requireSSL="false" />
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        您可以尝试通过将 SessionID 放在页面上的某个位置(用于测试)来调试它

        HttpContext.Current.Session.SessionID
        

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

        【讨论】:

        • 奇怪的是,当 Session["XBCPEmail"] 为空时,HttpContext.Current.Session.SessionID 的值是相同的,在单击按钮之前以及在 Page_Init 处。
        • 这是本地而不是在服务器上的答案,我在每次回发后重置 sessionid 时遇到问题,这是由于我的 web.config 设置中有 引起的。这是服务器上的 PCI 合规性要求,它只在本地影响我。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          我在重定向之前设置 Session 变量时遇到了这个问题。我在 Web.config 中有 enableSessionState="ReadOnly"。这是因为会话不存在并且重定向发生在客户端可以设置会话 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 */
          }
          

          【讨论】:

            【解决方案8】:
            <httpCookies requireSSL="false" />
            

            从本地 web.config 中删除它对我有用。只有在本地运行应用程序时才会出现此问题。

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

            【讨论】:

              【解决方案9】:

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

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

              在&lt;system.web&gt; 部分

              【讨论】:

                猜你喜欢
                • 2015-03-28
                • 1970-01-01
                • 2017-09-20
                • 1970-01-01
                • 2023-03-24
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多