我将在具有 .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
这可能会导致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。