web-dev-qa-db-ja.com

ASP.NETのクラスからセッション変数にアクセスする方法は?

アプリケーションのApp_Codeフォルダーにクラスファイルを作成しました。セッション変数があります

Session["loginId"]

クラスのこのセッション変数にアクセスしたいのですが、次の行を書いているときにエラーが発生します

Session["loginId"]

ASP.NET 2.0(C#)のapp_codeフォルダーに作成されたクラス内のセッション変数にアクセスする方法を教えてください

150
Prashant

(完全性のために更新)
Session["loginId"]を使用して任意のページまたはコントロールからセッション変数にアクセスでき、System.Web.HttpContext.Current.Session["loginId"].を使用して任意のクラス(クラスライブラリ内など)からセッション変数にアクセスできます。

しかし、私の元の答えを読んでください...


セッション変数へのアクセスを簡素化するために、私は常にASP.NETセッションのラッパークラスを使用します。

public class MySession
{
    // private constructor
    private MySession()
    {
      Property1 = "default value";
    }

    // Gets the current session.
    public static MySession Current
    {
      get
      {
        MySession session =
          (MySession)HttpContext.Current.Session["__MySession__"];
        if (session == null)
        {
          session = new MySession();
          HttpContext.Current.Session["__MySession__"] = session;
        }
        return session;
      }
    }

    // **** add your session properties here, e.g like this:
    public string Property1 { get; set; }
    public DateTime MyDate { get; set; }
    public int LoginId { get; set; }
}

このクラスは、ASP.NETセッションに自身の1つのインスタンスを格納し、次のように、クラスからタイプセーフな方法でセッションプロパティにアクセスできるようにします。

int loginId = MySession.Current.LoginId;

string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;

DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;

このアプローチにはいくつかの利点があります。

  • 多くの型キャストからあなたを救います
  • アプリケーション全体でハードコードされたセッションキーを使用する必要はありません(例:Session ["loginId"]
  • mySessionのプロパティにXMLドキュメントコメントを追加して、セッションアイテムをドキュメント化できます。
  • セッション変数をデフォルト値で初期化できます(たとえば、それらがnullでないことを保証します)
353
M4N

スレッドHttpContextを介してセッションにアクセスします-

HttpContext.Current.Session["loginId"]
100
AnthonyWJones

提案されたソリューションの問題は、アウトプロセスセッションストレージを使用している場合、SessionStateに組み込まれている一部のパフォーマンス機能が破損する可能性があることです。 (「状態サーバーモード」または「SQLサーバーモード」)。 oopモードでは、セッションデータをページリクエストの終わりにシリアル化し、ページリクエストの始めにシリアル化を解除する必要がありますが、コストがかかる可能性があります。パフォーマンスを向上させるために、SessionStateは、最初にアクセスされたときに変数を逆シリアル化するだけで必要なもののみを逆シリアル化しようとし、変更された変数のみを再シリアル化して置き換えます。多くのセッション変数があり、それらをすべて1つのクラスに押し込むと、セッションを使用するすべてのページリクエストでセッションのすべてが本質的に非シリアル化され、クラスが変更されたために1つのプロパティのみが変更された場合でもすべてをシリアル化する必要がありますたくさんのセッションとoopモードを使用している場合に考慮すべきことです。

22
Ernie

私の前に提示された答えは問題の適切な解決策を提供しますが、このエラーが発生する理由を理解することが重要だと感じています:

SessionPageプロパティは、その特定のリクエストに関連するタイプHttpSessionStateのインスタンスを返します。 Page.Sessionは、実際にはPage.Context.Sessionの呼び出しと同等です。

MSDN これがどのように可能かを説明します:

ASP.NETページにはSystem.Web名前空間(HttpContextクラスを含む)への既定の参照が含まれているため、HttpContextへの完全修飾クラス参照なしで.aspxページでHttpContextのメンバーを参照できます。

ただし、App_Codeのクラス内でこのプロパティにアクセスしようとすると、クラスがページクラスから派生しない限り、プロパティを使用できません。

このよくあるシナリオの私の解決策は、ページオブジェクトをクラスに渡さないことです。必要に応じて、ページSessionから必要なオブジェクトを抽出し、場合に応じて名前と値のコレクション/配列/リストの形式でクラスに渡します。

12
Cerebrus

カスタムSessionクラス内でセッション変数を操作しようとしたため、同じエラーが発生しました。

現在のコンテキスト(system.web.httpcontext.current)をクラスに渡す必要があり、すべてがうまくいきました。

MA

1
MunsterMan

Asp.netコアでは、これは異なる動作をします。

public class SomeOtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private ISession _session => _httpContextAccessor.HttpContext.Session;

    public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void TestSet()
    {
        _session.SetString("Test", "Ben Rules!");
    }

    public void TestGet()
    {
        var message = _session.GetString("Test");
    }
}

ソース: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/

0
Matty

これは、アプリケーションにとっても開発者にとってもより効率的です。

Webプロジェクトに次のクラスを追加します。

/// <summary>
/// This holds all of the session variables for the site.
/// </summary>
public class SessionCentralized
{
protected internal static void Save<T>(string sessionName, T value)
{
    HttpContext.Current.Session[sessionName] = value;
}

protected internal static T Get<T>(string sessionName)
{
    return (T)HttpContext.Current.Session[sessionName];
}

public static int? WhatEverSessionVariableYouWantToHold
{
    get
    {
        return Get<int?>(nameof(WhatEverSessionVariableYouWantToHold));
    }
    set
    {
        Save(nameof(WhatEverSessionVariableYouWantToHold), value);
    }
}

}

実装は次のとおりです。

SessionCentralized.WhatEverSessionVariableYouWantToHold = id;
0
Captain America