セッションの途中でSession_Endが複数回呼び出されました

asp.net iis internet-explorer sessionend

Session_Endを誤って使用していますか?

私のアプリケーションでは、ページの読み込みを高速化するためのキャッシュを持っていますが、それは非常にうまく機能します。 最近、誰かが私にそれを空にしないことでメモリをリークしていることを示唆し、そのセッションIDに関連するキャッシュエントリをすべて消去するSession_Endのメソッドを実装することを提案しました。

時折私は異常な行動を見始めました。 ページをロードするときに、空のページが表示されることはほとんどありません。そのページのキャッシュが空のため、例外が発生しています。 次回の発生時にキャッチすることを期待して、キャッシュアクセスとsession_endメソッドにデバッガブレークポイントを設定しました。

次回それが起こったとき、私は実際に起こっていたことにかなり驚いた。 私のブラウザは開いたままになっていましたが長い間アイドル状態だったので、私はそれが古いセッションクッキーを持っていたと思います。 それはページのためにサーバにヒットし、それはキャッシュにページのコピーを置きます。 ページがまだロードされている間に、Session_Endが即座に呼び出され、それによってキャッシュからそれが削除されます。 ブラウザをリロードすると、Session_Endが呼び出され続け、問題のあるブラウザが要求しているセッションを強制的に閉じようとします。

だから私は私の本当の質問があると思います:

  • 古いCookieがIISにとってそれほど無害な場合、ブラウザが新しいセッションCookieを取得しないのはなぜですか。

  • Session_Endは単にこのように使われるようには設計されていませんか?

  • 私がやろうとしていることをするより良い方法はありますか?

@Sosh – 私のglobal.asax.cs:

protected void Session_End(Object sender、EventArgs e){//セッションの有効期限が切れたときにオブジェクトキャッシュをクリーンアップするstring sessionID = this.Session.SessionID;

foreach(Global.DataGroups.Keysの文字列キー){if(key.EndsWith(sessionID)){Global.DataGroups.Remove(key); }}}

  2  1


ベストアンサー

はい、もっと良い方法があります。 組み込みのCacheオブジェクトを使用してください。 あなたは車輪を再発明しているようです…​ キャッシュははるかに信頼性が高くなります。 セッションタイムアウトと一致するように有効期限を設定するだけです。 20分ごとにキャッシュをリロードする必要があるとしたら、どうでしょうか。

一般的に、Session_EndはApplication_Endと少し似ていることがわかりました。それは、いつ呼び出されるのか、また場合によっては直感的にわかりにくい場合があるため、絶対にわかりません。

1


タイトルとURLをコピーしました