Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果更改,请重新加载xml文件_C#_Asp.net_Xml - Fatal编程技术网

C# 如果更改,请重新加载xml文件

C# 如果更改,请重新加载xml文件,c#,asp.net,xml,C#,Asp.net,Xml,我有一个XML文件,我在其中保存了一些应用程序设置 我读取这个xml文件并将其缓存在内存中,如果我更改设置,我想从xml文件中读取最新的更改,但我怎么知道,xml文件已更改 我在web环境(asp.net)中运行这个应用程序。我不知道它在web服务环境中是否能正常工作(在该场景中使用它在web上有很多点击),但是你可以使用这个类 不过,可能有理由不这样做。至少有一个我工作过的团队出于安全原因,避免在更改配置文件时自动执行代码。相反,他们选择定期重新加载文件,而不考虑更改(每30秒一次) 根据需要

我有一个XML文件,我在其中保存了一些应用程序设置
我读取这个xml文件并将其缓存在内存中,如果我更改设置,我想从xml文件中读取最新的更改,但我怎么知道,xml文件已更改


我在web环境(asp.net)中运行这个应用程序。

我不知道它在web服务环境中是否能正常工作(在该场景中使用它在web上有很多点击),但是你可以使用这个类

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


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

我不知道它在web服务上下文中是否能正常工作(网络上有关于在该场景中使用它的点击),但是您可以使用该类

不过,可能有一些原因不这样做。至少有一个我工作过的团队出于安全原因,避免在更改配置文件时自动执行代码。相反,他们选择定期重新加载该文件,而不考虑更改(每30秒一次)

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

您可以使用类来监视该文件

另一方面,您可能想在Web.CONFIG文件中考虑保存设置,无论是在AppStor还是自定义配置部分。您的Web应用程序在配置更改时将自动重新加载。

< P>可以使用类来监视文件。


另一方面,您可能想在Web.CONFIG文件中考虑保存设置,无论是在AppStor还是自定义配置部分。您的Web应用程序将在您的配置更改时自动重新加载。

< P>如果您将应用程序设置放在App.CONFIG文件中,则可以强制用“

更新缓存设置”。
 //update app settings
 ConfigurationManager.RefreshSection("appSettings");

如果将应用程序设置放在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
   }
}
使用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
   }
}

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

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

在应用程序启动时,应用程序读取文件并将设置对象以“文件依赖关系”插入ASP.NET缓存中。每次通过代码检查对象是否在缓存中,以及是否发现该对象一直使用同一对象。当文件更改时,您猜到了,缓存将删除设置的旧副本,这意味着您将被删除将从缓存中返回null。此时,您的“启动”代码路径将再次运行,重新加载文件,并将新的设置对象插入缓存(具有依赖项)

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


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

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

在应用程序启动时,应用程序读取文件并将设置对象以“文件依赖关系”插入ASP.NET缓存中。每次通过代码检查对象是否在缓存中,以及是否发现该对象一直使用同一对象。当文件更改时,您猜到了,缓存将删除设置的旧副本,这意味着您将被删除将从缓存中返回null。此时,您的“启动”代码路径将再次运行,重新加载文件,并将新的设置对象插入缓存(具有依赖项)

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


您将对XML文件进行更改,对吗?其他应用程序是否会对您的XML文件进行任何更改?如果没有,我认为您应该知道XML文件何时发生更改,因为您将是进行更改的人:)您将对XML文件进行更改,对吗?其他应用程序会对XML文件做任何更改吗?如果没有,我认为您应该知道XML文件何时发生更改,因为您将是进行更改的人:)我从.NET 2.0开始就没有看过这个,但我相信对web.config的任何更改都会导致appdomain重新加载,这可能会导致