Изменение конфигурации приложения без перезапуска приложения

#c# #.net #app-config #configuration-files

#c# #.net #app-config #конфигурация-файлы

Вопрос:

У меня следующая проблема: я внедряю новую функцию в приложение (запускаемое как служба Windows), и я хотел бы, чтобы эта новая функция управлялась (вкл / выкл) с помощью какой-либо записи в файле конфигурации (MyKey). Я могу сохранить запись конфигурации в app.config, но если я захочу изменить ее с on-> off или иным образом, для этого потребуется перезапустить службу Windows, а я хочу избежать этого. Я хочу, чтобы мое приложение запускалось и получало изменения в конфигурации.

Вопрос в том, существует ли встроенный механизм в .NET, который решает эту проблему? Думаю, я мог бы создать свой собственный конфигурационный файл, затем использовать FileSystemWatcher и т.д… Но, возможно, .NET позволяет использовать внешние конфигурационные файлы и перезагрузит значение??

 ConfigurationManager.AppSettings["myKey"]
  

Спасибо, Павел

ПРАВКА 1: Спасибо за ответы. Однако я написал следующий фрагмент, и он не работает (я попытался создать appSettingSection в обоих местах: до и внутри цикла):

 static void Main(string[] args)
{
    Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    // AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings");
    for (int i = 0; i < 10; i  )
    {
        ConfigurationManager.RefreshSection("appSettings");
        AppSettingsSection appSettingSection = (AppSettingsSection)config.GetSection("appSettings");
        string myConfigData = appSettingSection.Settings["myConfigData"].Value; // still the same value, doesn't get updated
        Console.WriteLine();
        Console.WriteLine("Using GetSection(string).");
        Console.WriteLine("AppSettings section:");
        Console.WriteLine(
          appSettingSection.SectionInformation.GetRawXml()); // also XML is still the same
        Console.ReadLine();
    }
}
  

Я вручную редактирую файл конфигурации, когда приложение останавливается на консоли.ReadLine().

Ответ №1:

Как только исходный файл app.config загружен, его значения кэшируются, поэтому, как вы знаете, вам придется перезапустить приложение. Способ обойти это — создать новый объект конфигурации и прочитать ключи вручную следующим образом:

 var appConfig = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location);
string myConfigData = appConfig.AppSettings.Settings["myConfigData"].Value;
  

Комментарии:

1. Спасибо! Но все же: таким образом, каждый раз, когда я обращаюсь к myConfigData, мне пришлось бы создавать новый объект конфигурации, чтобы быть уверенным, что AppConfig. Настройки приложений. Настройки[«myConfigData»].Значение согласуется с базовым значением в файле app.config?

2. Просто позвоните ConfigurationManager.RefreshSection("appSettings"); перед вызовом appConfig.AppSettings.Settings["myConfigData"].Value; , который заставит приложение прочитать новые и измененные настройки. В противном случае ConfigurationManager по своей сути кэширует все значения.

3. RefreshSection вызов @TeomanSoygul обновляет значение, полученное через ConfigurationManager.AppSettings[] это не влияет на экземпляр конфигурации.

Ответ №2:

Если вы обрабатываете конфигурацию вручную (возможно, даже не в файле app.config), то вы можете периодически проверять этот файл на наличие обновлений.

FileSystemWatcher это … вероятно, излишне и не гарантируется во всех сценариях. Лично я бы просто опрашивал файл каждые (скажем) 30 секунд.

Комментарии:

1. Привет, вы имеете в виду объединение с использованием решения, описанного @Teoman Soygul. Я думаю, что перезагрузка этой настройки каждые 1 минуту удовлетворила бы мои потребности.

2. @dragonfly ну, вроде того; хотя я, возможно, не обязательно использую для этого путь app-config. Однако любой маршрут будет работать; это не обязательно должно быть сложным.

Ответ №3:

Просто обновите «AppSettings» из текущего конфигурационного файла, прежде чем читать значение:

 ConfigurationManager.RefreshSection("appSettings"); // Reload app settings from config file
ConfigurationManager.AppSettings["myKey"];          // Read the value as usually
  

Нет необходимости усложнять это, создавая другую конфигурацию или что-либо подобное, что когда-либо предлагалось в вашем вопросе или других ответах!