我有一个XML文件,我保存了一些应用程序设置。
我读了这个xml文件并将其缓存在内存中,如果我更改了设置,我想从xml文件中读取最新的更改,但我怎么知道,xml文件被更改了?
我在网络环境(asp.net)中运行这个应用程序
答案 0 :(得分:3)
您可以使用FileSystemWatcher类来监控文件。
或者,您可能需要考虑web.config文件中的储蓄设置,可以在appSettings或自定义配置部分中进行。当您的配置发生变化时,您的Web应用程序将自动重新加载。
答案 1 :(得分:2)
如果您将应用程序设置放在app.config文件中,则可以强制更新缓存的设置:
//update app settings
ConfigurationManager.RefreshSection("appSettings");
答案 2 :(得分: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
}
}
答案 3 :(得分:1)
已经回答了'FileSystemWatcher'选项,但您也可以使用带有'文件依赖性'的ASP.NET缓存。
我假设您不希望将实时更新发送到浏览器,您只想在其他代码运行时使用服务器端的新值。
在应用启动时,您的应用会读取文件并将设置对象插入带有“文件依赖关系”的ASP.NET缓存中。每次通过代码检查以查看对象是否在缓存中,如果找到它继续使用相同的对象。当文件发生变化时,您猜对了,缓存将驱逐您设置的旧副本,这意味着您将从缓存中返回null。此时,您的“启动”代码路径再次运行,重新加载文件,并将新设置对象重新插入缓存(具有依赖关系)。
ASP.NET缓存是线程安全的,只要您的反序列化不会导致任何副作用,就可以安全地读取和插入而无需任何锁定或同步。 (这意味着两个请求/线程可以同时重新读取更新的设置文件,但这通常没问题,只要文件很小。)IIRC FileSystemWatcher解决方案很难做到正确并且需要同步。
http://www.dotnetfunda.com/articles/article791-data-caching-with-file-dependency-in-aspnet-.aspx
答案 4 :(得分:0)
我不知道它是否能在Web服务上下文中运行良好(网上有关于在该场景中使用它的点击),但您可以使用FileSystemWatcher类。
但可能有理由不这样做。至少有一个我参与过的团队有安全理由避免在更改配置文件时自动执行代码。相反,他们选择定期重新加载文件,无论更改(每30秒)。
根据您的要求,您还可以将设置存储在数据库表中,并避免在代码中缓存值。这将允许您利用数据库功能(历史记录,回滚,远程编辑,权限,利用您已有的任何现有数据库部署/备份策略),并允许您在存储过程中使用该配置,而不仅仅是在您的存储过程中网络服务代码。