7

セッション構造を実装しています。

ConcurrentDictionaryサーバー側ですべての<SessionId, UserSession>ペアを保持しています。

新しい接続が確立されると、オプションに応じて、Cookie がクライアント ブラウザ、perm または temp に割り当てられRememberMeます。

クライアントがLogOut関数を呼び出すと、ディクショナリからセッションが削除されます。

ただし、クライアント ブラウザが単純に閉じられるかクラッシュし、Cookie が失われたり、期限切れになったり、削除されたりした場合、メモリ内のサーバー側セッション オブジェクトはディクショナリに残り、ゴーストになります。時間が経つにつれて、これらの幽霊は積み重なっていきます。

私の質問は、デッド セッションが期限切れになった後にクリーンアップできるように設計を改善する方法は?

掃除スケジュールを実行するタイマーサービスを作ろうと思ったのですが、エレガントではありません。外部サービスに依存せずにこれを行う簡単な方法はありますか?

4

3 に答える 3

5

私のプロジェクトの1つで同様の状況があります。

辞書の代わりに、短い絶対有効期限とユーザーのセッション ID を持つキャッシュをキャッシュ キーとして使用しました。

HttpContext.Current.Cache.Insert(sessionID, userEntity, null, DateTime.Now.AddSeconds(30), TimeSpan.Zero);

クライアント側では、15 秒ごとに ajax 呼び出しを行い、サーバーに通知し、そのセッション ID のキャッシュを更新します。

そのため、ユーザーがブラウザ ウィンドウを閉じるたびに、サーバーは通知を受信せず、ユーザーのセッション ID は自動的に期限切れになります。

于 2013-09-29T08:02:10.013 に答える