измените значение конфигурации в файле app.config проекта tets

#c# #configuration #app-config #configuration-files

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

Вопрос:

я пытаюсь протестировать некоторые функциональные возможности, которые зависят от значения конфигурации (если Settings["foo"] = true, чем return 5, в противном случае — return -1).

Итак, что я пытаюсь сделать, это изменить значение конфигурации во время выполнения.
мой конфигурационный файл выглядит так (упрощенно):

     <configSections>
      <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">      
        <section name="DomainSettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
      </sectionGroup>
    </configSections>

<applicationSettings>
<DomainSettings>
    <setting name="foo" serializeAs="String">
      <value>false</value>
    </setting>
</ICTS.SmartQueue.Domain.DomainSettings>
</applicationSettings>
  

и я делаю следующее:

 //get config file
System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
//get relevant section
var section = (ClientSettingsSection)config.GetSection("applicationSettings/DomainSettings");
//get element from section
var element = section.Settings.Get("Foo"); 
//change its value and save it
element.Value.ValueXml.InnerText = true.ToString();
config.Save(System.Configuration.ConfigurationSaveMode.Modified, true);
//force refresh
ConfigurationManager.RefreshSection("applicationSettings/DomainSettings");
  

Я вижу, что значение фактически изменяется, когда я просматриваю файл конфигурации теста в каталоге ‘Out’ (MyTests.DLL.config).
Тем не менее, DomainSettings.Default.Foo по-прежнему оценивается как «false».

есть идеи?

Ответ №1:

Файл конфигурации кэшируется. Другими словами, только потому, что вы изменяете файл конфигурации с новым значением, он не будет перезагружаться до перезагрузки приложения. Затем вы увидите, что новое значение изменилось. Но когда вы ссылаетесь на файл конфигурации в своем коде, он не считывает файл, он считывает конфигурацию, которая кэшируется. И в вашем случае это не обновляется с вашим новым значением.

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

1. Я подумал, что ConfigurationManager.RefreshSection это должно позаботиться об этом. (из MSDN: «Этот метод делает недействительным кэш для указанного раздела конфигурации, не затрагивая другие разделы».)

Ответ №2:

Это потому, что вы можете изменить файл конфигурации во время выполнения, но изменения не будут обнаружены до перезапуска приложения. ASP.NET отличается тем, что он распознает изменения сразу после изменения файла Web.config.

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

1. итак, если я изменю значения в web config — во время выполнения — он сразу увидит изменения? с автоматическим перезапуском приложения?

2. Да, это произойдет, потому что приложение будет перезапущено автоматически.