Session_End を間違って使用していますか?
私のアプリケーションでは、ページの読み込みを高速化するためのキャッシュがあり、非常にうまく機能します。最近、ある人から、メモリを空にしないとメモリ リークが発生するので、そのセッション ID に関連付けられたキャッシュ エントリをすべてクリアするメソッドを Session_End に実装するよう提案されました。
時折、異常な動作が見られるようになりました。ページをロードするときに、空のページが表示されることはほとんどありません。そのページのキャッシュが空であるため、例外が表示されます。キャッシュ アクセスと session_end メソッドにデバッガー ブレークポイントを設定し、次に発生したときにキャッチできるようにしました。
次にそれが起こったとき、私は実際に何が起こっていたのか非常に驚いた. 私のブラウザは開いたまま長時間アイドル状態だったので、古いセッション Cookie があったと推測されます。ページのサーバーにヒットし、ページのコピーがキャッシュに入れられます。ページがまだロードされている間に、Session_End が即座に呼び出され、キャッシュからページが削除されます。ブラウザーをリロードすると、Session_End が呼び出され続け、貧弱なブラウザーが要求し続けるセッションを積極的に閉じようとします。
したがって、私の本当の質問は次のとおりだと思います。
- 古いセッション Cookie が IIS にとって非常に不適切な場合、ブラウザが新しいセッション Cookie を取得しないのはなぜですか?
- Session_End は、このように使用するように設計されていませんか?
- 私がやろうとしていることを行うためのより良い方法はありますか?
@Sosh - 私の global.asax.cs:
protected void Session_End(Object sender, EventArgs e)
{
//clean up object cache on session expiry
string sessionID = this.Session.SessionID;
foreach (string key in Global.DataGroups.Keys)
{
if (key.EndsWith(sessionID))
{
Global.DataGroups.Remove(key);
}
}
}