web-dev-qa-db-ja.com

C#セッションのクリア

質問#1

私はいつ使うべきか知りたい:

Session.Abandon() //トレース中および呼び出し後にこれを使用すると、セッションにまだ値があることがわかります。

そして、いつ使用することになっていますか:

Session.Clear()

特定の各メソッドをいつ使用する必要がありますか?


  • 一般に?
  • 私の特定のケースでは?

セッションがページ読み込みでnullに等しくないかどうかを確認します。セッションがnullに等しい場合、セッションをクリアしてログインページにリダイレクトしたいですか?

このようなものを使用する必要があります:

private void initSession()
{
    Session.Clear();
    Session.Abandon();
    Response.Redirect("LoginPage.aspx");
}
50

ASP.NETでは、いつSession.Abandon()ではなくSession.Clear()を使用すべきですか?

Session.Abandon()はセッションを破棄し、Session_OnEndイベントがトリガーされます。

Session.Clear()は、オブジェクトからすべての値(コンテンツ)を削除するだけです。同じキーを持つセッションはまだ生きています。

したがって、Session.Abandon()を使用すると、その特定のセッションが失われ、ユーザーは新しいセッションキーを取得します。たとえば、ユーザーがログアウトするときに使用できます。

ユーザーを同じセッションに残したい場合(たとえば、ユーザーに再ログインさせたくない場合)、セッション固有のデータをすべてリセットしたい場合は、Session.Clear()を使用します。

Session.Abandon()とSession.Clear()の違いは何ですか

クリア-セッション状態コレクションからすべてのキーと値を削除します。

放棄-セッションに保存されているすべてのオブジェクトを削除します。 Abandonメソッドを明示的に呼び出さない場合、サーバーはこれらのオブジェクトを削除し、セッションがタイムアウトしたときにセッションを破棄します。また、Session_Endなどのイベントを発生させます。

Session.Clearは棚からすべての本を削除することと比較できますが、Session.Abandonは棚全体を捨てるようなものです。

...

通常、ほとんどの場合、Session.Clearを使用する必要があります。ユーザーがサイトを離れることに確信がある場合は、Session.Abandonを使用できます。

違いに戻りましょう:

  • 放棄はSession_End要求を発生させます。
  • Clearはアイテムをすぐに削除しますが、Abandonは削除しません。
  • AbandonはSessionStateオブジェクトとそのアイテムを解放して、ガベージコレクションを行えるようにします。
  • Clearは、SessionStateとそれに関連付けられたリソースを保持します。

Session.Clear()またはSession.Abandon()?

セッションを終了するのではなく、セッション内のすべてのキーをクリアしてセッションを再初期化する場合は、Session.Clear()を使用します。

Session.Clear()は、Global.asaxファイルのSession_Endイベントハンドラーを実行しません。

ただし、一方でSession.Abandon()はセッションを完全に削除し、Session_Endイベントハンドラーを実行します。

Session.Clear()は、本棚から本を削除するようなものです

Session.Abandon()は本棚自体を投げるようなものです。

質問

ページの読み込みでnullと等しくない場合、いくつかのセッションをチェックします。それらのいずれかがnullに等しい場合、すべてのセッションをクリアしてログインページにリダイレクトしたいですか?

回答

ユーザーに再度ログインさせるには、Session.Abandonを使用します。

94
Mike Veigel

このトピックに非常に関連するこの記事をネットで見つけました。ここに投稿します。

ASP.NET内部-ASP.NETセッション変数のクリア

3
Saanch

もう1つの大きな違いは、Abandonはアイテムをすぐに削除しないが、クリーンアップするとセッションアイテムをループ処理し、特別に処理する必要があるSTA COMオブジェクトをチェックすることです。 そしてこれは問題になる可能性があります。

高負荷の場合、2つ(またはそれ以上)のリクエストが同じセッション(同じセッションCookieを持つ2つのリクエスト)でサーバーに送信される可能性があります。実行はシリアル化されますが、Abandonはアイテムを同期的にクリアせず、フラグを設定するため、両方のリクエストが実行され、両方のリクエストがワークアイテムをスケジュールして「後で」セッションをクリアできます。これらの作業項目は両方とも同時に実行でき、両方ともセッションオブジェクトをチェックし、両方ともオブジェクトの配列を消去します。リストを反復処理して変更する2つのことがあるとどうなりますか?ブーム!また、これはqueueuserworkitemコールバックで発生し、try/catchでは実行されないため(MSに感謝)、アプリドメイン全体がダウンします。行ったことがある。

3
Walden Leverich