これらの2つのコードの違いは何ですか。
HttpContext.Current.Session["myvariable"]
Session["myvariable"]
asp.net 4.0およびC#4.0
それらは実質的に同じであり、同じセッションデータにアクセスします。
コードビハインドでSession
を呼び出すことができるのは、ASP.NetページがデフォルトでSystem.Web.UI.Page
タイプを拡張するためです。これにはSession
パブリックプロパティがあります。このコードをReflectorで見ると、HttpContext.Current.Session
自体を(独自のContext
プロパティを介して)呼び出すだけであることがわかります。
他のクラスではそのプロパティにアクセスできませんが、Webアプリケーションのコンテキストで実行している限り、HttpContext.Current.Session
を使用して代わりにセッションデータにアクセスできます。
標準的なシナリオでは、それらは同じです。違いは、最初のステートメントがWebメソッドなどの静的コンテキストでも機能することです。
違いがあります。 2つ目(Session
)は、たとえばPage
のような多くの.NETオブジェクトのプロパティです。そのため、たとえば、これらのオブジェクトのコンストラクターではアクセスできません。ただし、最初のもの(HttpContext.Current.Session
)は常に準備ができており、自由に使用できます(もちろん、セッションが要求処理パイプラインにロードされた後)。
違いはありません。 Page.SessionはHttpContext.Current.Session
を返します
そうは言っても、私はWebアプリケーションの拡張子として機能する.dllを作成しました。これらの.dllにはSession
の概念がありません。これらのインスタンスでは、HttpContext.Current.Session
を参照することで、.dllを使用しているWebアプリケーションの現在のセッションにアクセスできます。
違いはありません。それらは同じものです。 2番目の形式は短いです:)
動作に違いはありません。 HttpContextを直接利用できないカスタムクラスでコードを使用していて、セッション値にアクセスする場合は、コードの最初の行を使用しますが、ページまたはコントロールクラスでアクセスする場合は2行目を使用します。
ニコラス・キャリーからの別のかなり完全な答え 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参照を返すのではなく」
内部的には、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。