web-dev-qa-db-ja.com

Global.asaxでHttpContext.Current.Sessionがnullになるのはなぜですか?

私はVS2010を使用していて、単純なaspを作成しました。開発サーバーを使用してテストするWebフォームアプリケーション。
[。 'Application_AuthenticateRequest'メソッドと 'Session_Start'メソッドを使用しています。
最初のラウンド:AuthenticateRequestが呼び出されました。次のコードが実行されました。

public static void Initialize(string login_name, bool force_refresh)
    {
      HttpSessionState Session = HttpContext.Current.Session;
      object o = Session == null ? null : Session["EMPLOYEE_DATA"];
      if (force_refresh || o == null || o.GetType() != typeof(Employee) || (o as Employee).login_name!= login_name)
      {
        _current = UIManager.GetEmployee(login_name);
        if (Session != null)
        {
          Session["EMPLOYEE_DATA"] = _current;
        }
      }
      else
      {
        _current = (Employee)o;
      }
    }

_current変数は、静的プロパティを介して公開されるプライベート静的フィールドです。最初のラウンドでは、Sessionはnullですが、Session_Startがまだ呼び出されていないので、問題ないと思います。 Session_Startは次のようになります。

protected void Session_Start(object sender, EventArgs e)
{
  Session["EMPLOYEE_DATA"] = EmployeeFactory.Current;
}

次のラウンドではもちろんSession_Startは呼び出されませんが、AuthenticateRequestではセッションにアクセスできません。 HttpContext.Current.Sessionがnullであり、this.Session参照がHttpExceptionをスローすると、「セッション状態はこのコンテキストでは使用できません」と表示されます。

ただし、どのpage_loadイベントからでもセッションにアクセスできますが、page_loadごとに認証を行うのは悪い習慣だと思います。セッションにアクセスするにはどうすればよいですか?

アドバイスをありがとう、
Péter

16
Péter

現時点ではバインドされていないため、Application_AuthenticateRequestでSessionを使用することはできません。

イベントApplication_AcquireRequestStateを使用できると思います。

37