31

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

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

上記以外に、静的フィールドを使用してデータを保存し、どこでも利用できるようにするべきではない理由はありますか?

4

4 に答える 4

44

いいえ、これに静的変数を使用することは適切ではありませ

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

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

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

負荷分散を使用してすべてのユーザーが同じサーバーにアクセスできるようにし、AppDomain がリサイクルされた場合やサーバーがダウンした場合にセッションが失われることを気にしない場合はセッション ID をキーとしてメモリに保持できます ...しかし、注意してください。


1 ASP.NET には、セッション情報を 1 つの AppDomain から別の AppDomain に伝達するメカニズムが存在する可能性があります。

于 2013-02-06T07:13:27.067 に答える
13

それらは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"];
    }
}

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

于 2013-02-06T07:12:04.133 に答える
9

あなたは一つのことを忘れています(私は思う)

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

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

于 2013-02-06T07:12:17.923 に答える
6

静的フィールドはすべてのユーザーで共有されます。
as web 環境では、複数のスレッドが一緒に実行されます。

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

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

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

于 2013-02-06T07:12:54.553 に答える