ConfigurationManager.RefreshSection(" appSettings")无效

时间:2015-12-23 16:10:04

标签: c#

背景: 我使用Timer在Windows服务中定期进行一些工作。我希望Timer在运行时可配置。我唯一能做的就是在启动时配置它。

我的解决方案: 我使用app.config来配置计时器的开始时间和周期:

  <appSettings>
    <add key="StartTime" value="14:40:00"/>
    <add key="Period" value="24:00:00"/>
  </appSettings>

我使用FileSystemWatcher来通知配置文件上的文件写入(将是AppName.exe.config)

    public ConfigWatcher(params object[] args)
    {
        configurationChangedListeners = new List<INotifyConfigurationChanged>();

        string assemblyDirectory = AppDomain.CurrentDomain.SetupInformation.ApplicationBase;
        NotifyFilters notifyFilters = NotifyFilters.LastWrite;
        _fileSystemWatcher = new FileSystemWatcher()
        {
            Path = assemblyDirectory,
            NotifyFilter = notifyFilters,
            Filter = "*.config"
        };
        _fileSystemWatcher.Changed += OnChanged;
        _fileSystemWatcher.EnableRaisingEvents = true;

        if (args != null)
        {
            foreach (var arg in args)
            {
                AddListener(arg);
            }
        }
    }

    private void OnChanged(object source, System.IO.FileSystemEventArgs e)
    {
        try
        {
            _fileSystemWatcher.EnableRaisingEvents = false;
            ConfigurationManager.RefreshSection("appSettings");
            foreach (var listener in configurationChangedListeners)
            {
                listener.NotifyConfigurationChanged();
            }
        }
        finally
        {
            _fileSystemWatcher.EnableRaisingEvents = true;
        }
    }

最后,每个监听器都得到如下配置:

public void NotifyConfigurationChanged()
{
    string strKeyName = "StartTime";
    string startTime = ConfigurationManager.AppSettings[strKeyName];
    // ...
}

问题是: - 当我编辑文件时,文件监视器会触发事件,但是当我尝试获取新的AppSettings时,我会读取OLD值(从服务启动时开始)

奇怪的是,在某些时候这个设置工作,然后它没有(据我所知,没有改变代码)。

非常感谢任何帮助/建议。

3 个答案:

答案 0 :(得分:4)

问题的答案(在大量搜索之后:D)是使用OpenExeConfiguration而不是直接访问AppSettings。根据我的理解,刷新后需要再次打开配置:

var appSettings = ConfigurationManager.OpenExeConfiguration(System.Reflection.Assembly.GetEntryAssembly().Location).AppSettings;
string setting = appSettings.Settings[strKeyName].Value;

我很肯定,当我第一次试用时,第一种变体在某种情况下起作用了......

答案 1 :(得分:3)

如果在VS中启动应用程序,请确保编辑正确的配置文件。我花了几个小时才赶上那个。看:

在调试execute(app_name).vshost.exe时,如果要更新任何密钥,则还必须修改(app_name).vshost.exe.config!

其次,sectionName是CaseSeNsItIvE))

也许对某人来说这会有所帮助。

答案 2 :(得分:0)

这是一个简单的答案:

Prelude Data.List> divisors 1425
[1,1425,3,475,5,285,15,95,19,75,25,57]

.Save可以解决问题