1. ホーム
  2. asp.net

[解決済み] 現在のASP.NETセッションがNULLの場合、どうすればよいですか?

2022-06-26 16:01:40

質問

私の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?
}

どのように解決するのですか?

はい、SessionオブジェクトはNULLかもしれませんが、それは特定の状況においてのみであり、めったに遭遇することはありません。

ページにしかコードがない場合は、これに遭遇することはないでしょう。私の ASP .NET コードのほとんどは、NULL を繰り返しチェックすることなく Session を使用しています。しかし、IHttpModule を開発している場合、または ASP .NET の細かい部分にまで踏み込んでいる場合は、考えなければならないことがあります。

編集

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

AcquireRequestState は、制御がページに渡される前に実行されます。そのため、静的クラスを含む他の機能をページから呼び出している場合は、問題ないでしょう。

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

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