Когда настройки из app.config действительно читаются? - PullRequest
7 голосов
/ 08 февраля 2012

Когда настройки из app.config действительно читаются приложением?

Предположим, у меня есть служба Windows и некоторые настройки приложения для нее.В коде у меня есть метод, где используются некоторые настройки.Метод вызывается на каждой итерации, а не один раз за все время.Если я изменю значение настройки через файл конфигурации, должен ли я перезапустить службу, чтобы она была «обновлена» внутри, или она будет принята в следующий раз без какого-либо взаимодействия с моей стороны?

Ответы [ 2 ]

5 голосов
/ 08 февраля 2012

Вам необходимо вызвать ConfigurationManager.RefreshSection , чтобы получить последние значения, считанные непосредственно с диска.Вот простой способ проверить и дать ответ на ваш вопрос:

static void Main(string[] args)
{
    while (true)
    {
        // There is no need to restart you application to get latest values.
        // Calling this method forces the reading of the setting directly from the config.
        ConfigurationManager.RefreshSection("appSettings");
        Console.WriteLine(ConfigurationManager.AppSettings["myKey"]);

        // Or if you're using the Settings class.
        Properties.Settings.Default.Reload();
        Console.WriteLine(Properties.Settings.Default.MyTestSetting);

        // Sleep to have time to change the setting and verify.
        Thread.Sleep(10000);
    }
}

Мой app.config, содержащий:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
      <section name="ConsoleApplication2.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
    </sectionGroup>
  </configSections>
  <appSettings>
    <add key="myKey" value="Original Value"/>
  </appSettings>
  <userSettings>
    <ConsoleApplication2.Properties.Settings>
      <setting name="MyTestSetting" serializeAs="String">
        <value>Original Value</value>
      </setting>
    </ConsoleApplication2.Properties.Settings>
  </userSettings>
</configuration>

После запуска приложения откройте app.config вСоздайте папку и измените значение appSetting «myKey».Вы увидите новое значение, выведенное на консоль.

Чтобы ответить на вопрос, да, они кэшируются при первом чтении каждого из них, я думаю, и для принудительного чтения прямо с диска, вынужно обновить раздел.

1 голос
/ 08 февраля 2012

Либо при загрузке через диспетчер конфигурации (ConfigurationManager.GetSection ("x / y");), либо при попытке доступа к свойствам.

Здесь есть небольшая серая область, потому что когда вы выводите конфигурацию через менеджер конфигурации:

var config = (MyConfigSection)ConfigurationManager.GetSection("MyConfigSection");

Вы получаете объект конфигурации обратно, если вы указали тип раздела конфигурации в элементе configurationSections в верхней части файла конфигурации. Если вы фактически не предоставите реальную конфигурацию, вы все равно получите объект обратно.

Однако если у вас есть обязательное поле, которое не установлено, оно не будет выдавать исключение, пока вы не вызовете свойство. Я работал над этим, пытаясь выполнить модульное тестирование своих пользовательских разделов конфигурации.

...