1. ホーム
  2. c#

[解決済み] ASP.NET Static Variableのライフタイム

2023-07-01 15:31:42

質問

ページクラス(Global.asaxではない)で定義された静的変数に情報を保持しています。私は、次のようなコードで変数を宣言するだけです。

protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;

で、PageLoadイベントで変数を定義しています。例えば、私はデータベースからIDをチェックし、それがSomeGlobalUnsecureIDと異なる場合、SomeGlobalUnsecureIDとStringを別の場所から更新し、そうでなければそのままにします。これは、私のアプリのロジックでは完全に安全です(つまり、これらのデータは安全ではなく、誰もがそれらにアクセスでき、問題ありません)。

  1. 接続されているユーザーに関係なく、同じ量のメモリを保持する。

  2. 永続的な情報が「メモリ」にあるものと異なる場合にのみ変更する。 メモリ」内のものと異なる場合のみ変更します(実際に文字列を読むのは時間がかかるので です。

現在、PageLoadでチェックを行うため、再読み込みされたページには問題がありません。しかし、私のページはWebMethodsでいっぱいで、時々、静的変数がゼロになるのを見ます。そして、不思議なことに、静的変数がゼロになっても、セッションはアクティブなままです (so-> サーバーやアプリプールの再起動などはありません)。

これは、私にとって本当に不思議です。私は、静的変数が、アプリケーションが (何らかの形で) 終了するまでその値を保持すると仮定しています。しかし、セッションが期限切れにならなかったとしても、静的変数はゼロになっています。どうしたらいいでしょうか?アプリケーション変数を使用する方が良い選択なのでしょうか?私がウェブ上で読んだすべてのドキュメントは、アプリケーション変数の代わりに静的変数を示唆しています、私はそれらを何らかの形で異なって宣言する必要がありますか?

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

静的変数は、アプリのドメインが存続する間、永続します。 したがって、静的変数が「リセット」される原因は、アプリのドメインを再起動するか、新しいクラスを使用することの 2 つです。 aspxページクラスに格納された静的変数の場合、ASP.NETがaspxページを新しいクラスに再コンパイルすると、古いページクラスが新しいクラスで置き換えられ、静的変数が失われる可能性があります。

そのような理由から、システムがクラスの再起動や置き換えを決定した場合 ( .NET は実行中のアプリ ドメインでクラス/アセンブリを削除またはアンロードしません。 ) の場合、再起動または置き換えによって新しいクラスを取得するため、静的変数がリセットされます。 これは、aspxページと クラスの両方に当てはまります。

ASP.NETは、何らかの理由でクラスを再コンパイルする必要があると考えた場合、クラスを置き換えます( ASP.NETの動的コンパイルを参照してください。 ).

アプリのドメイン再起動による静的変数の損失を防ぐことはできませんが、クラスの置き換えからそれを回避しようとすることはできます。 静的変数を aspx ページでない、App_Code ディレクトリにないクラスに置くことができます。 に置きたいと思うかもしれません。 static class に置くとよいでしょう。

public static class GlobalVariables
{
    public static int SomeGlobalUnsecureID;
    public  static string SomeGlobalUnsecureString;
}

静的変数はプール単位です。つまり、asp.netサイトを動かすプールが2つある場合、2つの異なる静的変数があるということです。( ウェブガーデンモード )

この方法のいずれかで、システムがasp.netアプリケーションを再起動した場合、静的変数は失われます。

  1. を使用すると、プールは再コンパイルが必要であると判断します。
  2. app_offline.htm ファイルを開きます。
  3. プールを手動で再起動する
  4. プールは、あなたが定義したいくつかの限界に達しており、再起動を行います。
  5. 何らかの理由で、iis またはプールを再起動します。

この静的変数はスレッドセーフではありません。 ロック キーワードを使用する必要があります。

アプリを再起動すると何があっても静的データはリセットされるので、本当にデータを永続化したいのであれば、カスタムクラスを使ってデータベースにデータを保存する必要があります。 ユーザーごとの情報は セッションの状態 データベースセッションの状態モード . ASP.NET Application State/Variables は、以下の理由で役に立ちません。 それらはデータベースではなく、メモリに保存されるからです。 であるため、アプリのドメイン再起動時に失われます。