2010-09-20 45 views
1

我有一个XML文件,我保存了一些我的应用程序设置。
我读这个xml文件并将其缓存在内存中,如果我更改设置我想从xml文件中读取最新更改,但是如何知道xml文件已更改?重新加载xml文件,如果发生变化

进出口运行这个应用程序在网络环境(asp.net)

+0

您将会对XML文件进行更改,对吧?其他应用程序是否会对您的XML文件进行任何更改?如果没有,我想你应该知道实际上当XML文件发生变化时,因为你将会是正在进行更改的人:) – 2010-09-20 17:58:11

回答

1

的“FileSystemWatcher的”选项已被回答,但您也可以使用具有'文件依赖性'的ASP.NET缓存。

我假设你不希望实时更新被发送到浏览器,你只是想在运行其他代码时使用新值服务器端。

在应用程序启动时,您的应用程序将读取该文件并使用“文件依赖性”将设置对象插入到ASP.NET缓存中。每次通过代码检查以查看对象是否在缓存中,并且如果找到,它将继续使用相同的对象。当文件改变时,你猜对了,缓存将驱逐你的设置的旧副本,这意味着你将从缓存中取回空值。此时,您的“启动”代码路径将再次运行,重新加载该文件,并将新设置对象重新插入缓存(具有依赖关系)。

ASP.NET缓存是线程安全的,只要您的反序列化不会导致任何副作用,在没有任何锁定或同步的情况下读取和插入都是安全的。 (这意味着两个请求/线程可以同时重新读取更新后的设置文件,但只要文件很小,通常就可以)。IIRC FileSystemWatcher解决方案很难正确且需要同步。

http://www.dotnetfunda.com/articles/article791-data-caching-with-file-dependency-in-aspnet-.aspx

+1

FileSystemWatcher在无状态的web上下文中工作吗? – Ehsan 2010-09-20 19:03:16

+0

我相信无国籍的问题得到了回答。我假设你不关心文件在响应单个请求时发生的变化,但是当文件在请求之间或在请求期间发生变化时,你会关心刷新从文件中加载的所有数据。具有依赖项的缓存条目将这样做。 – yzorg 2010-11-23 02:00:25

0

我不知道这是否会在一个Web服务环境中工作良好(有网络上的点击率都大约在场景中使用它),但您可以使用FileSystemWatcher类。

虽然可能有理由不这样做。至少有一个我曾经工作过的团队有安全原因,以避免自动更改配置文件执行代码。相反,他们选择定期重新加载文件,而不管更改(每隔30秒)。

根据您的要求,您也可以将设置存储在数据库表中,并避免在代码中缓存值。这将允许您利用数据库功能(历史记录,回滚,远程编辑,权限,利用您已有的任何现有数据库部署/备份策略),并允许您在存储过程中使用该配置,而不仅仅是在您的网络服务代码。

3

您可以使用FileSystemWatcher类来监视文件。

或者,您可能要考虑web.config文件中的储蓄设置,无论是在appSettings还是自定义配置部分。当您的配置更改时,您的Web应用程序将自动重新加载。

+0

自从.NET 2.0以来,我还没有看过这个,但我相信任何更改web.config会导致appdomain重新加载,与原始的“单独文件”解决方案相比,这可能会导致Web应用程序出现明显的暂停。 – yzorg 2010-09-20 18:17:49

+0

确实,更改web.config将重新加载应用程序域。这可能是一个问题,如果您的设置频繁更改,但不是很少更改。 – 2010-09-20 18:39:10

+0

我也遇到了FileSystemWatcher类的一致性问题。那些可能在.NET 1.1中,但他们让我完全信任这个类。 – 2010-09-20 18:39:52

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 
    } 
} 
+0

你的例子没有考虑到可能发生的许多问题:重命名,移动,删除,访问,甚至在它被创建之前... – Wernight 2011-06-17 15:41:20

相关问题