2

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);
            }
        }
    }
4

1 に答える 1

1

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

一般に、Session_End は Application_End に少し似ていることがわかりました。いつ呼び出されるかを完全に確認することはできず、直感に反することもあります。

于 2009-09-23T00:24:53.823 に答える