.NET 1.1 のサーバーで実行されている ASP.NET サイトを、.NET 2.0 で実行されている別のサーバーに移動しました。
ページの 1 つに、期限切れのセッションを検出する次のコードがあります。
protected void Page_Init(object sender, System.EventArgs e) {
if ( Session["XBCPEmail"] == null ) {
Response.Redirect("signin.aspx?expired=yes");
return;
}
}
(Session["XBCPEmail"] == null) は、ページのボタンの 1 つをクリックした後、1 つの予期しないケースで (セッションが期限切れになったかのように) true として解決されます。ボタンの1つだけで発生します。同じページの他のボタンと同様に、ボタン イベント ハンドラーは、同じページにリダイレクトする次のコードで終了します。
Response.Redirect("cpanel.aspx");
チェックした時点でResponse.Redirect("cpanel.aspx");
の値は有効な文字列であるため、と の(string)Session["XBCPEmail"]
間で何が起こり、が null になるかわかりません。Response.Redirect
Page_Init
Session["XBCPEmail"]
.NET 2.0 のセッション変数を null にする可能性があるのはどれですか? このコードは 1.1 ではその問題を抱えておらず、2.0 でも、ページ上の 1 つのボタンにしか影響しません。
更新:この問題は、ボタン イベント ハンドラーが外部の .exe プログラムを次のコードで呼び出した場合にのみ発生します。このコードがコメント化されている場合、Session 変数は null ではありません。コマンド ライン プログラムを実行するための外部プロセスの作成は、セッション変数が null であるかどうかにどのように影響しますか?
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 を使用する代わりに、問題が解消されました。