web-dev-qa-db-ja.com

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

私の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.Sessionがnullの場合

私の理解では、セッションは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?
}
118
Anthony

はい、Sessionオブジェクトはnullである場合がありますが、特定の状況でのみ、以下に遭遇することはめったにありません。

ページにコードしかない場合、これに遭遇することはありません。 ASP .NETコードのほとんどは、nullを繰り返しチェックせずにSessionを使用します。ただし、IHttpModuleを開発している場合、またはASP .NETの重要な詳細がダウンしているかどうかを検討する必要があります。

編集

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

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

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

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

152
driis

次の文は完全に正確ではありません。

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

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

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

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

[WebMethod(EnableSession = true)]

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

ソリューションを提供してくれたMatthew Cozierに感謝します。

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

エド

39
Ed Bishop

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

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

public class MyAshxClass : IHttpHandler, IRequiresSessionState
18
mathijsuitmegen

ASP.NET技術記事

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

編集:

セッション:初心者向けコンセプト

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

2
adatapost