1


1

変更された場合にXMLファイルをリロードする

XMLファイルがあり、その中にアプリケーション設定のいくつかを保存します。 +このxmlファイルを読み取ってメモリにキャッシュします。設定を変更すると、xmlファイルから最新の変更を読み取りたいのですが、どうすればxmlファイルが変更されますか?

Webコンテキスト(asp.net)でこのアプリを実行しています

5 Answer


3


FileSystemWatcherクラスを使用してファイルを監視できます。

または、appSettingsまたはカスタム構成セクションのweb.configファイルで節約設定を検討することもできます。 設定が変更されると、Webアプリケーションは自動的にリロードされます。


2


app.configファイルにアプリケーション設定を入れると、キャッシュ設定の更新を強制できます:

 //update app settings
 ConfigurationManager.RefreshSection("appSettings");


1


FilesystemWatcherを使用する

public class MessageFileWatcher
{
   public MessageFileWatcher(string Path, string FileName)
   {
      FileSystemWatcher Watcher = new FileSystemWatcher();
      Watcher.Path = Path;
      Watcher.Filter = FileName;
      Watcher.NotifyFilter = NotifyFilters.LastWrite;
      Watcher.Changed += new FileSystemEventHandler(OnChanged);
      Watcher.EnableRaisingEvents = true;
   }

   private void OnChanged(object source, FileSystemEventArgs e)
   {
      // Do something here based on the change to the file
   }
}


1


「FileSystemWatcher」オプションは回答されましたが、「ファイル依存性」でASP.NETキャッシュを使用することもできます。

リアルタイムの更新をブラウザに送信したくないので、他のコードが実行されているときにサーバー側で新しい値を使用したいだけです。

アプリの起動時に、アプリはファイルを読み取り、「ファイル依存関係」を使用して設定オブジェクトをASP.NETキャッシュに挿入します。 コードを実行するたびに、オブジェクトがキャッシュ内にあるかどうかを確認し、見つかった場合は同じオブジェクトを使用し続けます。 ファイルが変更されると、推測したとおり、キャッシュは設定の古いコピーを削除します。つまり、キャッシュからnullが返されます。 この時点で、「スタートアップ」コードパスが再び実行され、ファイルがリロードされ、新しい設定オブジェクトがキャッシュに(依存関係を伴って)挿入されます。

ASP.NETキャッシュはスレッドセーフであり、逆シリアル化が副作用を引き起こさない限り、ロックや同期なしで読み取りおよび挿入しても安全です。 (これは、2つの要求/スレッドが更新された設定ファイルを同時に再読み取りすることを意味しますが、ファイルが小さい限り、通常は問題ありません。)FileSystemWatcherソリューションのIIRC同期。


0


Webサービスコンテキストでうまく機能するかどうかはわかりません(そのシナリオでの使用についてはWeb上でヒットしています)が、http://msdn.microsoft.com/en-us/library/を使用できます。 system.io.filesystemwatcher.aspx [FileSystemWatcher]クラス。

ただし、これをしない理由があります。 私が取り組んだ少なくとも1つのチームには、構成ファイルの変更時にコードが自動的に実行されないようにするためのセキュリティ上の理由がありました。 代わりに、変更に関係なく(30秒ごとに)ファイルを定期的にリロードすることを選択しました。

要件によっては、設定をデータベーステーブルに保存し、コードに値をキャッシュしないようにすることもできます。 これにより、DBの機能(履歴、ロールバック、リモート編集、アクセス許可、既存の既存のDB展開/バックアップ戦略の活用)を利用でき、その構成をストアドプロシージャだけでなく、ストアドプロシージャでも使用できるようになります。 Webサービスコード。