web-dev-qa-db-ja.com

これら2つのHttpContext.Current.SessionとSession-asp.net 4.0の違いは何ですか

これらの2つのコードの違いは何ですか。

HttpContext.Current.Session["myvariable"]
Session["myvariable"]

asp.net 4.0およびC#4.0

20
MonsterMMORPG

それらは実質的に同じであり、同じセッションデータにアクセスします。

コードビハインドでSessionを呼び出すことができるのは、ASP.NetページがデフォルトでSystem.Web.UI.Pageタイプを拡張するためです。これにはSessionパブリックプロパティがあります。このコードをReflectorで見ると、HttpContext.Current.Session自体を(独自のContextプロパティを介して)呼び出すだけであることがわかります。

他のクラスではそのプロパティにアクセスできませんが、Webアプリケーションのコンテキストで実行している限り、HttpContext.Current.Sessionを使用して代わりにセッションデータにアクセスできます。

25
Kasaku

標準的なシナリオでは、それらは同じです。違いは、最初のステートメントがWebメソッドなどの静的コンテキストでも機能することです。

8
Variant

違いがあります。 2つ目(Session)は、たとえばPageのような多くの.NETオブジェクトのプロパティです。そのため、たとえば、これらのオブジェクトのコンストラクターではアクセスできません。ただし、最初のもの(HttpContext.Current.Session)は常に準備ができており、自由に使用できます(もちろん、セッションが要求処理パイプラインにロードされた後)。

5
Saeed Neamati

違いはありません。 Page.SessionはHttpContext.Current.Sessionを返します

そうは言っても、私はWebアプリケーションの拡張子として機能する.dllを作成しました。これらの.dllにはSessionの概念がありません。これらのインスタンスでは、HttpContext.Current.Sessionを参照することで、.dllを使用しているWebアプリケーションの現在のセッションにアクセスできます。

3
James Hill

違いはありません。それらは同じものです。 2番目の形式は短いです:)

2
Icarus

動作に違いはありません。 HttpContextを直接利用できないカスタムクラスでコードを使用していて、セッション値にアクセスする場合は、コードの最初の行を使用しますが、ページまたはコントロールクラスでアクセスする場合は2行目を使用します。

2
Nps

ニコラス・キャリーからの別のかなり完全な答え https://stackoverflow.com/a/6021261/365017

「HttpApplicationのSessionプロパティは、Proporty HttpContext.Current.Sessionの動作とは異なる動作を示します。どちらも、使用可能な場合、同じHttpSessionStateインスタンスへの参照を返します。使用可能なHttpSessionStateのインスタンスがない場合の動作は異なります。現在のリクエスト。

すべてのHttpHandlerがセッション状態を提供するわけではありません。そのためには、HttpHandlerがマーカーインターフェイスIRequiresSessionStateまたはIReadOnlySessionStateを実装する必要があります[一方または両方?]。

使用可能なセッションがない場合、HttpContext.Current.Sessionは単にnullを返します。

HttpApplicationのSessionプロパティの実装は、HttpContextをスローしますが、このコンテキストでは、Session state is not availableというメッセージが表示されます。 null参照を返すのではなく」

1
Steve G.

内部的には、Page.SessionはIt's HttpContext.Current.Sessionのみを指しますが、呼び出される場所に応じて2つの違いがあります。

Page.SessionはSystem.Web.UI.Pageから継承されたクラスからのみアクセスでき、WebMethodからアクセスされるとHttpExceptionをスローします。
Webアプリケーションのコンテキストで実行している限り、どこからでもHttpContext.Current.Sessionにアクセスできます。


Page.Sessionにはアクセスできるが、HttpContext.Current.Sessionにはアクセスできないその他の重要な違い:

ページにGetDataという名前のメソッド(System.Web.UI.Pageから継承)があり、他のページメソッドとは異なるスレッドで同時に実行されている場合、GetDataメソッドはPage.Seessionにアクセスできますが、 HttpContext.Current.Sessionにアクセスできません。

GetDataが別のスレッドから呼び出されたため、HttpContext.Currentがnullであり、HttpContext.Current.Sessionがnull参照例外をスローしますが、Page.Sessionは引き続きページオブジェクトにアタッチされるため、ページメソッドGetDataはPage.Session。

0
Jay Shah