app.config刷新部分没有重新加载appsettings部分

时间:2017-03-02 19:54:48

标签: c# app-config

好吧,我讨厌在这个“不工作”上有很多其他帖子但是考虑到我花了3天时间试图让ConfigurationManager在运行时重新加载以防止重新启动我的服务,我无处可去。 / p>

我一直在使用这篇博客文章:

http://dejanstojanovic.net/aspnet/2015/june/auto-realod-application-config-in-net/

帮助我创建一个filewatcher,然后在保存文件时重新加载该部分。

我修改了它以刷新文件更改的appSettings部分(参见下面的代码);但是,无论我尝试哪种方式,它都不会刷新该部分,只会显示启动时存在的值。

我试过了:

  • 将监视器类从外部项目移动到相同的代码库/项目中,以确保它不会受到某种跨域保护业务的干扰。
  • 在app.config中添加一个单独的部分并重新加载,以确保它不是基于保护appSettings部分的.net安全性。
  • 尽我所能重命名appSettings以确保它不是命名问题(在任何地方refreshsection(..)都是区分大小写的。)

希望有人在这里可以指出我是一个如此白痴的地方!

代码:

public class ConfigMonitor
{
    private readonly FileSystemWatcher _watcher;
    private DateTime _lastChange;

    public ConfigMonitor(string configFilePath)
    {
        if (configFilePath == null)
        {
            throw new ArgumentNullException(nameof(configFilePath));
        }

        _lastChange = DateTime.MinValue;
        configFilePath = string.Concat(System.Reflection.Assembly.GetEntryAssembly().Location, ".config");
        if (File.Exists(configFilePath))
        {
            _watcher = new FileSystemWatcher(Path.GetDirectoryName(configFilePath), Path.GetFileName(configFilePath))
            {
                EnableRaisingEvents = true
            };
            _watcher.Changed += Watcher_Changed;
        }
    }

    ~ConfigMonitor()
    {
        _watcher.EnableRaisingEvents = false;
        _watcher.Changed -= Watcher_Changed;
        _watcher.Dispose();
    }

    public void Stop()
    {
        _watcher.EnableRaisingEvents = false;
        _watcher.Changed -= Watcher_Changed;
        _watcher.Dispose();
    }

    private void Watcher_Changed(object sender, FileSystemEventArgs e)
    {
        if ((DateTime.Now - _lastChange).Seconds <= 5 || IsFileLocked(e.FullPath)) return;
        var monitoredSections = ConfigurationManager.AppSettings["monitoredSections"];

        if (monitoredSections != null)
        {
            IEnumerable<string> sections = monitoredSections.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
            if (sections.Any())
            {
                foreach (var section in sections)
                {
                    ConfigurationManager.RefreshSection(section);
                }
            }
        }
        else
        {
            Debug.WriteLine(ConfigurationManager.AppSettings["TEST"]);
            ConfigurationManager.RefreshSection("appSettings");
            Debug.WriteLine(ConfigurationManager.AppSettings["TEST"]);
        }
        _lastChange = DateTime.Now;
    }

    private bool IsFileLocked(string filePath)
    {
        FileStream stream = null;
        try
        {
            stream = File.OpenRead(filePath);
        }
        catch (IOException)
        {
            return true;
        }
        finally
        {
            stream?.Close();
        }
        return false;
    }
}

1 个答案:

答案 0 :(得分:0)

您可以尝试加载配置的新实例,而不是使用静态ConfigurationManager。

 this.commissions =angular.copy(res.Data);
 this.oldCommissions =angular.copy(res.Data);