web-dev-qa-db-ja.com

静的フィールドとセッション変数

これまで、Sessionを使用して、あるページから別のページにいくつかの変数を渡していました。たとえば、ユーザーの役割。ユーザーがWebアプリケーションにログインすると、ユーザーのロールIDはセッションに保持され、そのロールはアプリケーションのさまざまな部分でチェックされます。私は最近、静的メンバーを代わりに使用しない理由を考え始めました。同じ情報を静的フィールドに格納して、アプリケーションのどこにでも簡単にアクセスできます(その静的フィールドが存在する名前空間が含まれている場所であればどこでも)。

  1. セッションにはあらゆる種類のデータを保存できます。ただし、キャストする必要があります。ただし、静的フィールドは正しいデータ型のデータのみを受け入れます。
  2. セッション変数は、多くの場合に必要な動作である一定の時間が経過すると期限切れになります。

上記とは別に、静的フィールドを使用してデータを格納し、どこでも使用できるようにする理由は他にありますか?

29

いいえ、これに静的変数を使用することはnotの方法です:

  • AppDomainがリサイクルされると、すべての静的変数が「リセット」されます
  • 静的変数は水平方向にスケーリングしません-アプリケーションの負荷を分散すると、あるサーバーにヒットしたユーザーは別のサーバーにアクセスしても、最初のサーバーの静的変数にデータストアが表示されません。
  • 最も重要なことは、静的変数はそのサーバーへのallアクセスによって共有されます...それはユーザーごとではありません...あなたの説明から、あなたは望んでいないでしょうユーザーYの情報を表示するユーザーX。

基本的に、アプリケーションの周囲に情報を伝播するには、2つの選択肢があります。

  • クライアント側に保持して、各リクエストが前のステップの情報を提供するようにします。 (これは、大量の情報を使用すると扱いにくくなる可能性がありますが、単純なケースでは役立ちます。)
  • サーバー側、理想的には永続的の方法(データベースなど)で保持し、クライアントがセッション識別子を提供するようにします。

Ifロードバランシングを使用してすべてのユーザーが同じサーバーにアクセスできるようにすることができますif AppDomainがリサイクルされるときにセッションが失われることを気にしません1 またはサーバーがダウンした場合は、セッションIDをキーとしてメモリに保持できますが、注意してください。


1 これを乗り切るためのASP.NETのメカニズムがあり、セッション情報を1つのAppDomainから別のAppDomainに伝播する可能性があります-よくわかりません

38
Jon Skeet

それらは2つの非常に異なるものです。

  • セッションはプロセス外で使用できます(負荷分散に重要)
  • プロセス外の機能により、セッションの耐久性が向上します。
  • ASP.Netは、セッションの同時実行性を自動的に管理します。
  • 静的変数へのアクセスは手動で同期する必要があります。
  • 静的はアプリドメイン全体にグローバルです。1人のユーザーに静的フィールド/プロパティの値を設定すると、すべてのユーザーが同じ値を取得します。シナリオで望ましい動作ではありません。

セッションにはあらゆる種類のデータを保存できます。ただし、キャストする必要があります。ただし、静的フィールドは正しいデータ型のデータのみを受け入れます。

多くの場合、ヘルパークラスを使用してSession値を抽象化すると便利です。これにより、テスト容易性が向上し、プロパティを厳密に型指定して、クラスの内部でキャストを実行できるようになります。

例:

public List<int> UserRoles
{
    get
    {
        // optionally check that the value is indeed in session, otherwise this 
        // will throw
        return (List<int>)Session["UserRoles"];
    }
}

以下も参照してください。

12
Tim Medora

あなたは一つを忘れます(私は思う)

静的データは、アプリケーションのすべてのユーザーで同じですが、セッションは「ユーザーごと」です。

したがって、「ユーザーロール」のシナリオでは、面白い結果が期待できます;)

9

静的フィールドはすべてのユーザー間で共有されます。
Web環境では、いくつかのスレッドが一緒に実行されます。

静的メンバーを更新するには、適切な同時実行制御が必要です。これを誤ると、サイトのパフォーマンスが大幅に低下します。

セッションをプロセス外に移動して、Webファーム全体で共有できます。

アプリサーバーがクラッシュした場合でも、プロセス外セッションが存在します。

6
nunespascal