これはおそらく簡単な作業であることはわかっていますが、これを達成する方法の良い例を見つけることができませんでした. 私のaspアプリケーションには、ユーザーが更新できるTextBoxがあります。この変数の値を中央の場所に保存して、ページにアクセスするすべてのユーザーに対して TextBox の Text プロパティがその変数に設定されるようにする方法を探しています。また、この変数は、別のユーザーが更新するまで存続する必要があります。最悪の場合、データベース テーブルを作成してこの値を保存し、そこからプルすることもできますが、asp または IIS にこの機能が組み込まれていると想像しました。
2 に答える
あなたが探しているものは と呼ばれApplication State
ます。
次のように使用できます。
Application["Message"] = "Welcome to the Contoso site.";
たとえば、リストのようなオブジェクトを保存することもできます。
Application["MyList"] = new List<string>();
List<string> myList = Application["MyList"] as List<string>;
myList.Add("Test");
同時実行の問題
Vlad Bezdenが追加したように、複数のスレッドが Application コレクションを同時に変更しようとする場合に備えて、Application コレクションを同期することが重要です。これは、次のようにコレクションを最初にロックしてからロック解除することによって行われます。
Application.Lock();
//Do any code that modifies or retrieves a value from the collection here
Application['MyMessage'] = "MyMessage";
MyClass myObject = Application['MyObject'] as MyClass;
Application.UnLock(); //Make sure you unlock it, or you will be in for a world of hurt.
アプリケーションの状態はフリースレッド化されています。つまり、アプリケーションの状態データには多くのスレッドが同時にアクセスできます。したがって、アプリケーションの状態データを更新するときは、組み込みの同期サポートを含めてスレッドセーフな方法で行うことが重要です。Lock メソッドと UnLock メソッドを使用すると、一度に 1 つのソースだけが書き込みできるようにデータをロックすることで、データの整合性を確保できます。また、Global.asax ファイルの Application_Start メソッドでアプリケーションの状態値を初期化することにより、同時実行の問題が発生する可能性を減らすこともできます。
並行性の問題について詳しくは、こちらをご覧ください。
スケーラビリティに関する懸念
John SaundersとServyがコメントで指摘したように、複数の Web サーバーがアプリケーションを一緒に実行する Web ファーム/クラウド シナリオのように、アプリケーションのスケーリングを考慮する必要がある場合は、データベース ソリューションを使用してアプリケーションを維持することを検討することをお勧めします。永続データ。その後、Web サーバーとは別にデータベースのニーズをスケーリングでき、同時実行に関する懸念事項の一部も処理できます。ただし、このシナリオでもアプリケーション状態を使用して、頻繁に更新されないデータをキャッシュすることをお勧めします。
Web サーバーが 1 つしかない場合は、アプリケーション状態を使用できますが、アプリケーション状態は Web ファームでは機能しません。アプリケーションが Web ファームで実行され、複数の Web サーバー間で状態を共有する必要がある場合は、集中型ストレージ (DB) を使用する必要があります。
アプリケーションの状態が機能する場合は、変更を加える前に、アプリケーションオブジェクトをロックおよびロック解除する必要がある競合状態がないことを確認してください
Application.Lock();
Application["myMessage"] = newValue;
Application.UnLock();