[解決済み] ASP.NET Static Variableのライフタイム
質問
ページクラス(Global.asaxではない)で定義された静的変数に情報を保持しています。私は、次のようなコードで変数を宣言するだけです。
protected static int SomeGlobalUnsecureID;
protected static string SomeGlobalUnsecureString;
で、PageLoadイベントで変数を定義しています。例えば、私はデータベースからIDをチェックし、それがSomeGlobalUnsecureIDと異なる場合、SomeGlobalUnsecureIDとStringを別の場所から更新し、そうでなければそのままにします。これは、私のアプリのロジックでは完全に安全です(つまり、これらのデータは安全ではなく、誰もがそれらにアクセスでき、問題ありません)。
-
接続されているユーザーに関係なく、同じ量のメモリを保持する。
-
永続的な情報が「メモリ」にあるものと異なる場合にのみ変更する。 メモリ」内のものと異なる場合のみ変更します(実際に文字列を読むのは時間がかかるので です。
現在、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アプリケーションを再起動した場合、静的変数は失われます。
- を使用すると、プールは再コンパイルが必要であると判断します。
- app_offline.htm ファイルを開きます。
- プールを手動で再起動する
- プールは、あなたが定義したいくつかの限界に達しており、再起動を行います。
- 何らかの理由で、iis またはプールを再起動します。
この静的変数はスレッドセーフではありません。 ロック キーワードを使用する必要があります。
アプリを再起動すると何があっても静的データはリセットされるので、本当にデータを永続化したいのであれば、カスタムクラスを使ってデータベースにデータを保存する必要があります。 ユーザーごとの情報は セッションの状態 と データベースセッションの状態モード . ASP.NET Application State/Variables は、以下の理由で役に立ちません。 それらはデータベースではなく、メモリに保存されるからです。 であるため、アプリのドメイン再起動時に失われます。
関連
-
[解決済み] UnityでOnCollisionEnterが呼ばれない
-
[解決済み] Pythonで静的なクラス変数は可能ですか?
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Static readonly」対「const」。
-
[解決済み] C言語における「static」の意味とは?
-
[解決済み] JavaScriptの静的変数
-
[解決済み] ASP.NET MVC - カスタムIIdentityまたはIPrincipalの設定
-
[解決済み] C++の関数内のスタティック変数のライフタイムは?
-
[解決済み】KotlinでJavaの静的メソッドに相当するものは何ですか?
-
[解決済み】C++におけるstaticキーワードとその様々な使用法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】取り消せないメンバはメソッドのように使えない?
-
[解決済み] [Solved] アセンブリ System.Web.Extensions dll はどこにありますか?
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】Entity FrameworkからのSqlException - セッション内で他のスレッドが動作しているため、新しいトランザクションは許可されません。
-
[解決済み】Visual Studio: 操作を完了できませんでした。パラメータが正しくありません
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み】C#のequal to演算子でtextとvarcharのデータ型は互換性がない
-
[解決済み】2つ(またはそれ以上)のリストを1つに統合する(C# .NETで
-
[解決済み】ファイルやアセンブリ、またはその依存関係の1つをロードできませんでした。