現在のASP.NETセッションがnullの場合はどうすればよいですか?


125

私のWebアプリケーションでは、セッション変数を読み取るために次のようなことをしています。

if (HttpContext.Current.Session != null &&  HttpContext.Current.Session["MyVariable"] != null)
{
    string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}

HttpContext.Current.Session ["MyVariable"]がnullである理由を確認することが重要である理由を理解しています(変数はまだセッションに格納されていないか、セッションがさまざまな理由でリセットされている可能性があります)。HttpContext.Current.Sessionnullの場合

私の理解では、セッションはASP.NETによって自動的に作成されるため、HttpContext.Current.Sessionがnullになることはありません。この仮定は正しいですか?nullの可能性がある場合、何かを格納する前にチェックする必要があることを意味しますか?

if (HttpContext.Current.Session != null)
{
    HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
    // What should be done in this case (if session is null)?
    // Is it possible to force the session to be created if it doesn't exist?
}

ASP.NET WebApiには異なる動作があります。ASP.NETWeb APIを使用してセッション
TiagoGouvêaApr

回答:


158

はい、Sessionオブジェクトはnullの可能性がありますが、特定の状況でのみ、めったに実行されません。

ページ内にコードしかない場合、これに遭遇することはありません。ほとんどのASP .NETコードは、nullを繰り返しチェックせずにセッションを使用します。ただし、IHttpModuleを開発している場合や、ASP .NETの細部にまでこだわっていない場合は、検討する必要があります。

編集する

コメントへの回答:セッション状態が使用可能かどうかは、要求に対してAcquireRequestStateイベントが実行されたかどうかによって異なります。これは、セッションCookieを読み取り、適切なセッション変数のセットを見つけることによって、セッション状態モジュールが機能する場所です。

AcquireRequestStateは、コントロールがページに渡される前に実行されます。したがって、静的クラスを含む他の機能をページから呼び出す場合は、問題ありません。

たとえば、Application_Startイベントで、または静的コンストラクターを使用して、起動時に初期化ロジックを実行するクラスがある場合、セッション状態を使用できない場合があります。現在の要求があり、AcquireRequestStateが実行されているかどうかがわかります。

また、クライアントでCookieが無効になっている場合でも、Sessionオブジェクトは引き続き使用できますが、次のリクエストで、ユーザーは新しい空のセッションで戻ります。これは、クライアントにまだセッションステートバッグがない場合、セッションステートバッグが与えられるためです。クライアントがセッションCookieを転送しない場合、クライアントを同じものとして識別する方法がないため、新しいセッションが何度も渡されます。


6
今日見つけたクイックアップデートだけです。セッションはページコンストラクターでは使用できません!Initイベント以降のみ。
Nuno Agapito 2012

マスターページのPage_Loadイベントによって呼び出されるHttpContext.Current.Session == nullのコードが発生しました。どうやら、これページのコンテキストで発生する可能性があります。HttpContext.Currentオブジェクトを検査すると、ほとんどのメンバーは初期化されていますが、CurrentNotificationとIsPostNotificationがエラーをスローします:{System.PlatformNotSupportedException}。原因が何であれ、この問題は、何年も実行されている本番環境では発生していません。プラットフォームはWindows Server 2003 R2 SP2で、アプリケーションにはターゲットフレームワーク.Net 3.5があり、セッション状態が有効になっているIISで実行されます。
R. Schreurs 2012年

また、IISがディスクに存在するリソースファイル(スタイルシートなど)への直接リクエストを処理しているときにHttpContext.Current.Session、 `Application_AcquireRequestState 'のコードに対してnullになる可能性があることもわかりました。ただし、ページ自体のリクエストによって、セッションオブジェクトがそこでコード化できるようになります。これは少なくともMVC.NET 4の下にあります。
ingredient_15939

出力キャッシュされたMVCアクション内にいる場合もnullになる可能性があると思います。
user2173353

40

次のステートメントは完全に正確ではありません。

「そのため、静的クラスを含む他の機能をページから呼び出す場合は、問題ありません」

HttpContext.Current.Sessionを介してセッションを参照する静的メソッドを呼び出していますが、それはnullです。ただし、私はjQueryを使用してajaxを介してwebserviceメソッドを介してメソッドを呼び出しています。

ここで見つけたように、メソッドの単純な属性で問題を修正するか、Webサービスセッションオブジェクトを使用できます。

ただし、トリックがあります。Webメソッド内でセッション状態にアクセスするには、次のようにセッション状態管理を有効にする必要があります。

[WebMethod(EnableSession = true)]

EnableSession値を指定することにより、管理されたセッションで遊ぶことができます。この値を指定しないと、nullのSessionオブジェクトが取得され、セッションオブジェクトにアクセスしようとすると、null参照例外が発生する可能性が高くなります。

解決策を提供してくれたMatthew Cozierに感謝します。

ちょうど2セント追加すると思いました。

エド


1
Edに感謝、Sessionはwebmethodでnullとして表示されました-これを修正して修正しました。+1
fusi 2012

1
まあ、あなたがウェブサービスを呼び出すとき、あなたはそのページに対するものとは別のリクエストを使うので、そのステートメントはまだ正しいです、IMO。
driis

MSDNドキュメントはこちら - the default value is false。魅力のように機能します。
Benjineer、2015年

22

Sessionインスタンスがnullで、 'ashx'ファイル内にある場合は、 'IRequiresSessionState'インターフェイスを実装するだけです。

このインターフェイスにはメンバーがないため、クラス宣言(C#)の後にインターフェイス名を追加するだけです。

public class MyAshxClass : IHttpHandler, IRequiresSessionState

どうもありがとう、私のログインクラスではセッションがnullでした。私は私のASHXハンドラにこのコードを追加したとき、それはあまりにも私のクラスでセッションを投入
ATESダニス

これは問題にかなりよく答えると思います。本当にありがとう。
Sachin Joseph

2

ASP.NET技術記事

概要:ASP.NETでは、すべてのWebページはSystem.Web.UI.Pageクラスから派生します。Pageクラスは、セッションデータのHttpSessionオブジェクトのインスタンスを集約します。Pageクラスは、カスタマイズのためのさまざまなイベントとメソッドを公開します。特に、OnInitメソッドは、Pageオブジェクトの初期化状態を設定するために使用されます。リクエストにセッションCookieがない場合、新しいセッションCookieがリクエスタに発行されます。

編集:

セッション:初心者のためのコンセプト

概要:セッションは、ユーザーがWebアプリケーションの任意のページに対する最初の要求をサーバーに送信するときに作成され、アプリケーションはセッションを作成し、セッションIDを応答とともにユーザーに送り返し、小さなCookieとしてクライアントマシンに保存されます。 。したがって、理想的には「Cookieを無効にしたマシン、セッション情報は保存されません」。


2

私の場合ASP.NET State Serviceは中止されました。をに変更しStartup typeAutomaticサービスを初めて手動で開始すると、問題が解決しました。

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