2012-02-08 5 views
7

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

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

ответ

5

Чтобы получить последние значения, прочитанные непосредственно с диска, необходимо вызвать метод 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». Вы увидите новое значение, напечатанное на консоли.

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

+0

И если я получаю настройку следующим образом: Properties.Settings.Default.MyValue? – 26071986

+0

, используя Properties.Settings.Default.Reload(); – mservidio

+0

@ 26071986 - Я обновил свой ответ, чтобы отобразить код для использования класса «Настройки». – mservidio

1

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

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

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

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

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

Смежные вопросы