我有一个XML文件,我保存了一些我的应用程序设置。
我读这个xml文件并将其缓存在内存中,如果我更改设置我想从xml文件中读取最新更改,但是如何知道xml文件已更改?重新加载xml文件,如果发生变化
进出口运行这个应用程序在网络环境(asp.net)
我有一个XML文件,我保存了一些我的应用程序设置。
我读这个xml文件并将其缓存在内存中,如果我更改设置我想从xml文件中读取最新更改,但是如何知道xml文件已更改?重新加载xml文件,如果发生变化
进出口运行这个应用程序在网络环境(asp.net)
的“FileSystemWatcher的”选项已被回答,但您也可以使用具有'文件依赖性'的ASP.NET缓存。
我假设你不希望实时更新被发送到浏览器,你只是想在运行其他代码时使用新值服务器端。
在应用程序启动时,您的应用程序将读取该文件并使用“文件依赖性”将设置对象插入到ASP.NET缓存中。每次通过代码检查以查看对象是否在缓存中,并且如果找到,它将继续使用相同的对象。当文件改变时,你猜对了,缓存将驱逐你的设置的旧副本,这意味着你将从缓存中取回空值。此时,您的“启动”代码路径将再次运行,重新加载该文件,并将新设置对象重新插入缓存(具有依赖关系)。
ASP.NET缓存是线程安全的,只要您的反序列化不会导致任何副作用,在没有任何锁定或同步的情况下读取和插入都是安全的。 (这意味着两个请求/线程可以同时重新读取更新后的设置文件,但只要文件很小,通常就可以)。IIRC FileSystemWatcher解决方案很难正确且需要同步。
http://www.dotnetfunda.com/articles/article791-data-caching-with-file-dependency-in-aspnet-.aspx
我不知道这是否会在一个Web服务环境中工作良好(有网络上的点击率都大约在场景中使用它),但您可以使用FileSystemWatcher类。
虽然可能有理由不这样做。至少有一个我曾经工作过的团队有安全原因,以避免自动更改配置文件执行代码。相反,他们选择定期重新加载文件,而不管更改(每隔30秒)。
根据您的要求,您也可以将设置存储在数据库表中,并避免在代码中缓存值。这将允许您利用数据库功能(历史记录,回滚,远程编辑,权限,利用您已有的任何现有数据库部署/备份策略),并允许您在存储过程中使用该配置,而不仅仅是在您的网络服务代码。
您可以使用FileSystemWatcher类来监视文件。
或者,您可能要考虑web.config文件中的储蓄设置,无论是在appSettings还是自定义配置部分。当您的配置更改时,您的Web应用程序将自动重新加载。
自从.NET 2.0以来,我还没有看过这个,但我相信任何更改web.config会导致appdomain重新加载,与原始的“单独文件”解决方案相比,这可能会导致Web应用程序出现明显的暂停。 – yzorg 2010-09-20 18:17:49
确实,更改web.config将重新加载应用程序域。这可能是一个问题,如果您的设置频繁更改,但不是很少更改。 – 2010-09-20 18:39:10
我也遇到了FileSystemWatcher类的一致性问题。那些可能在.NET 1.1中,但他们让我完全信任这个类。 – 2010-09-20 18:39:52
,如果你把你的应用程序设置在app.config文件,你可以强制的缓存设置与更新:
//update app settings
ConfigurationManager.RefreshSection("appSettings");
使用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
}
}
你的例子没有考虑到可能发生的许多问题:重命名,移动,删除,访问,甚至在它被创建之前... – Wernight 2011-06-17 15:41:20
您将会对XML文件进行更改,对吧?其他应用程序是否会对您的XML文件进行任何更改?如果没有,我想你应该知道实际上当XML文件发生变化时,因为你将会是正在进行更改的人:) – 2010-09-20 17:58:11