7

我将在具有 .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.RedirectPage_Init这可能会导致Session["XBCPEmail"]变为空。

哪个可以使 .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。

4

9 回答 9

12

默认情况下Response.Redirect会终止线程执行,并且在设置会话变量时可能存在竞争条件。设置会话变量后不要重定向(或正确操作)一文中有描述,因此请尝试使用另一个不那么暴力的版本:

Response.Redirect("cpanel.aspx", false); 
于 2013-11-09T01:04:13.663 回答
11

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

<httpCookies requireSSL="true" />

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

于 2016-03-24T09:16:06.127 回答
2

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

于 2018-06-26T09:50:14.220 回答
2

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

<httpCookies requireSSL="false" />
于 2016-05-26T14:41:45.697 回答
1

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

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

HttpContext.Current.Session.SessionID

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

于 2013-11-09T01:07:12.963 回答
1
<httpCookies requireSSL="false" />

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

  • 从 web.config 中删除了设置
  • 将其添加到 web.staging.config 和 web.production.config
于 2017-12-08T11:48:42.153 回答
1

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

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

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 */
}
于 2017-07-25T17:36:50.290 回答
1

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

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

<system.web>部分

于 2019-05-21T19:59:02.443 回答
1

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

于 2016-10-22T10:34:42.027 回答