【发布时间】: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。
【问题讨论】: