コード:
Session["foo"] = "bar";
Response.Redirect("foo.aspx");
問題:
foo.aspx がセッションから "foo" を読み取るとき、そこにはありません。セッションは存在しますが、「foo」の値はありません。
これは、実稼働環境で断続的に観察されました。しかし、ここでResponse.Redirect() について質問するつもりはありません。
説明:
Bertrand Le Royは次のように説明しています (太字は私のものです)。
ここで Redirect が行うことは、クライアントに特別なヘッダーを送信して、サーバーが待っていたページとは別のページをサーバーに要求することです。サーバー側では、このヘッダーを送信した後、Redirect が応答を終了します。 これは非常に暴力的な行為です。 Response.End は、ThreadAbortException を使用しているページの実行を実際に停止します。ここで実際に起こることは、 セッション トークンが戦闘で失われることです。
ここでのポイントは、Response.Redirect() はスレッドの終了に手間がかかる可能性があるということです。そして、セッションの書き込みがあまりにも重い手の近くで発生すると、セッションの書き込みが脅かされる可能性があります。
質問:
ASP.NET セッション管理については、これに対して非常に脆弱です。Response.Redirect() コード行は、セッション書き込み行が「終了」するまで実行を開始しません。セッション書き込みに対する脅威となるのはどうしてですか?
次のコード行が実行される前にセッション書き込みが「終了」しないのはどうですか? セッションの書き込みが同様に (発生しなかったかのように) 失われるシナリオは他にありますか?