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


109

セッションの破棄とその値の削除の違いは何ですか?これを示す例を挙げていただけますか?

この質問を探しましたが、完全な答えはわかりません。いくつかの答えは:

  • Session.Abandon() セッションを破棄します
  • Session.Clear() すべての値を削除するだけです

友人が私にこう言った:

セッションをクリアしてもセッションの設定は解除されません。ユーザーのIDは同じですが、値はクリアされたままです。

Abandonはセッションを完全に破棄します。つまり、そのユーザーのセッションに値を保存する前に、新しいセッションを開始する必要があります。

以下のコードは機能し、例外をスローしません。

Session.Abandon();
Session["tempKey1"] = "tempValue1";

セッションをAbandon()すると、あなた(またはユーザー)が新しいSessionIdを取得します

セッションをテストしても、セッションを放棄しても何も変わりません。

私はただ1つの違いを見つけます: イベントをsession.Abandon()発生させSession_Endます


5
Session.Clearはすぐにアイテムを削除しますが、Session.Abandonは現在のリクエストの最後で破棄するセッションをマークします。
RepDbg 2014

回答:


147

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

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

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

あなたは言う:

セッションをテストしても、セッションを放棄しても何も変わりません。

これは、1回のリクエスト内でのみ実行できます。
次のリクエストでは、セッションは異なります。ただし、セッションIDは再利用できるため、IDは同じままです。

Session.Clearを使用する場合、多くのリクエストで同じセッションが発生します。

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

違いに戻りましょう:

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

そして、もし私がsession.clear()を呼んだら、これは再びaccuresに伝えます。じゃない?(他はすべてSession_Endイベントを発生させます)
バックドア

Session.Clearは、セッションから項目のみを削除します。これ以上何もない。必要なだけ何度でも呼び出すことができます。
Dmytrii Nagirniak 2009

@AnthonyWJones、あなたは正しい「破壊」と言うのは間違っています。セッションからオブジェクトを削除することをお勧めします。ただし、Session.Clearもオブジェクトを破棄せず、セッションからthmを削除して、ガベージコレクションできるようにします。また、COMPLEXオブジェクトを格納することはお勧めできません。
Dmytrii Nagirniak 2009

@Dmitriy:なぜ「COMPLEXオブジェクトの保存が推奨されない」のですか?
カマレイ2009

5
@広告私は同意しますが、Session.Clearすべての書籍を棚からすぐに削除することと比較できると言って延長しますが、Session.Abandon「棚全体を捨てて、完了したら通知してください」と言ったようなものです
WynandB 14

20

あなたするとAbandon()、セッションは、あなた(または、むしろユーザー)が(次のリクエストで)新しいのSessionIdを取得します。Clear()セッションを実行すると、保存されている値はすべて削除されますが、SessionIdはそのまま残ります。


3
ありがとう。しかし、mattew macdonaldsの本に同意すると、同じセッションIDを使用できます。i。web.configファイルのconfiguration / system.web / sessionState要素のregenerateExpiredSessionId属性がfalseの場合、ASP.Netは古いセッションIDを使用します
バックドア

2
@Hans Kesting放棄が呼び出されても、新しいセッションIDは取得されません。新しいセッションIDを取得するには、ASPNET_SessionID Cookieを明示的にnullに設定する必要があります。
Zoは2013年

9

これは、ソート上記の様々な応答によってカバーさで、私はこの記事を読んで初めて、私は私のコードにマイナーなバグにつながった重要な事実を、逃しました...

Session.Clear() すべてのキーの値をクリアしますが、セッション終了イベントを発生させません。

Session.Abandon()現在のリクエストの値はクリアされません。別のページが要求された場合、そのページの値は失われます。ただし、放棄するとイベントがスローされます。

それで、私の場合(そしておそらくあなたの場合ですか?)、Clear()続いてが必要でしたAbandon()


1
なぜSession.Clear()の後にSession.Abandon()が必要なのですか?破壊しているコレクションの値をクリアしていますか?これは完全に冗長です。確かに、セッションオブジェクトはすぐには破棄されません(現在のリクエストの最後に発生します)が、そのセッションIDは以降のリクエストで処理されなくなります。クライアントが新しい要求を行うと、新しいセッションがクライアントに与えられます。また、最初にClearを呼び出すと、Global.AsaxのSession_End()イベントでセッション変数にアクセスしたい場合に問題が発生します(それらをクリアしたため、そこには表示されません)。
RepDbg 2014

@RepDbgは実際には同意しません。Session.Abandon()。クライアントに新しいセッションIDを与えます。Session.clearは、セッションに関するサーバー上のすべての情報をクリアして、他のユーザーがそれを行えないようにします。NRCに同意します
Micah Armantrout

@ミカArmantrout私はあなたの論理に従っていません。Session.Clear()でセッションをクリアしてから、Session.Abandon()を呼び出してセッションをクリアするだけでなく、セッションの割り当てを完全に解除するのはなぜですか?また、Session.Abandon()はクライアントに新しいセッションIDを与えません。後続のリクエストでは、Session.Abandon()を呼び出したリクエストは実行されますが、フルフィルメントは実行されません。
RepDbg 2015年

Session.Abandonだけを使用する場合、ASP.NETパイプライン内の他の残りのロジックは、現在のセッション値にアクセスできます。
Mark Sowul

6

このコードは機能し、例外をスローしません:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

これは、Abandonメソッドが呼び出されると、現在のSessionオブジェクトが削除のキューに入れられますが、実際には、現在のページのすべてのスクリプトコマンドが処理されるまで削除されないためです。つまり、Abandonメソッドの呼び出しと同じページのSessionオブジェクトに格納されている変数にアクセスできますが、後続のWebページにはアクセスできません。

たとえば、次のスクリプトでは、3行目で値Maryが出力されます。これは、サーバーがスクリプトの処理を完了するまでSessionオブジェクトが破棄されないためです。

<% 
  Session.Abandon  
  Session("MyName") = "Mary" 
  Reponse.Write(Session("MyName")) 
%>

後続のWebページで変数MyNameにアクセスすると、空になります。これは、前の例を含むページの処理が完了すると、MyNameが前のSessionオブジェクトで破棄されたためです。

MSDN Session.Abandonから


3

セッションをクリアすると、そこに保存されていた値が削除されますが、そこに新しい値を追加することはできます。セッションを破棄すると、そこに新しい値を追加できなくなります。


感謝しますが、これは機能します:(あなたのアイデアと一致しません)Session ["tempKey1"] = "tempValue1"; Response.Write(Session ["tempKey1"]。ToString());
バックドア

実際にページを更新するとセッションが破棄されるためです。(通常)Cookieに保存されたセッションID。
RaYell

わかりません。つまり、Session.Abandon()を呼び出した後でも、値を追加できます。(ページがポストバックされ、再度レンダリングされた場合でも)。
バックドア

1
破棄された後、IDを自動再生成するようにセッションを設定することができます。したがって、破棄されたセッションに値を割り当てると、新しいセッションが自動的に生成されます。
RaYell

1
はい、このセッションIDを使用すると再生成されますが、私の質問は、session.clear()とsession.abandone()の違いは何ですか?このように、autoregenerateがfalseに設定されている場合、これらの2つのトウはSesion_Endを発生させる他の点で違いはありませんか?
バックドア

3

clear-itsは、セッション状態のコレクションからキーまたは値を削除します。

破棄-セッションからセッションオブジェクトを削除または削除しました。


1
Session.Abandon() 

セッション全体を破壊/殺します。

Session.Clear()

セッションデータ(つまり、現在のセッションのキーと値)を削除/クリアしますが、セッションは有効です。

Session.Abandon()メソッドと比較すると、Session.Clear()は新しいセッションを作成せず、セッション内のすべての変数をNULLにするだけです。

ブラウザが閉じられない限り、セッションIDはどちらの場合も同じままです。

Session.RemoveAll()

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

Session.Remove()

セッション状態のコレクションからアイテムを削除します。

Session.RemoveAt()

指定したインデックスにあるアイテムをセッション状態コレクションから削除します。

Session.TimeOut()

このプロパティは、アプリケーションのSessionオブジェクトに割り当てられたタイムアウト期間を指定します。(時間は分単位で指定されます)。

ユーザーがタイムアウト期間内にページを更新または要求しない場合、セッションは終了します。



0

を使うSession.Clear()よりも使うと便利だと思いますSession.Abandon()

値は後で呼び出した後もセッションに存在しますが、前者を呼び出した後に削除されるためです。


0
this code works and dont throw any exception:

Session.Abandon();  
Session["tempKey1"] = "tempValue1";

ここで、Session.Clearはアイテムをすぐに削除しますが、Session.Abandonは、現在のリクエストの最後にセッションを破棄するようにマークします。それは単に、session.abandonコマンドが実行された直後にコード内の値にアクセスしようとした場合、それはまだそこにあることを意味します。そのため、session.abandonコマンドを発行してすぐにセッションで何らかのロジックを実行した後でもコードが機能しない場合でも、混乱しないでください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.