CloudConfigurationManager не получает ApplicationSettings из app.config
У меня есть библиотека, содержащая некоторые классы-помощники Azure. Внутри этих вспомогательных классов я получаю такие настройки, как имя и ключ учетной записи Azure. При запуске в Azure эти настройки выбираются из файла конфигурации облака (cscfg). Все это прекрасно работает.
Чтобы unit test эти классы за пределами Azure (в частности, RoleEnvironment), я создал настройки с теми же именами переменных в проекте unit test. Они фактически сохраняются в файле app.config и редактируются через раздел настроек, который находится в разделе свойств моего тестового проекта. Вместо того, чтобы создавать собственный метод абстрагирования настроек конфигурации облаков из настроек web.config/app.config, я решил использовать класс CloudConfigurationManager. Однако, когда я запускаю свои модульные тесты, ни один из моих настроек не подбирается, поэтому я просто получаю null. Если, однако, я изменяю свой файл app.config для использования настроек в формате "appSettings" ниже, тогда я получаю действительные значения. Недостатком этого является то, что я больше не могу редактировать свои настройки, используя страницу редактора настроек в visual studio.
Итак, мой вопрос заключается в том, что я делаю что-то неправильно или это ограничение диспетчера конфигурации облаков, благодаря чему он может только вручную добавлять добавленные appSettings, но не добавлять приложения, используя редактор?
<appSettings>
<add key="Foo" value="MySettingValue"/>
</appSettings>
вышеуказанные работы, тогда как ниже:
<applicationSettings>
<ComponentsTest.Properties.Settings>
<setting name="Foo" serializeAs="String">
<value>MySettingValue</value>
</setting>
</ComponentsTest.Properties.Settings>
</applicationSettings>
Ответы
Ответ 1
CloudConfigurationManager поддерживает только AppSettings часть файла web.config/app.config и будет пытаться читать значения здесь, если параметр отсутствует в конфигурации Azure. В документации указано, что он не будет читать файл web.config/app.config, если свойство RoleEnvironment.IsAvailable истинно (работает в Azure), но это неверно, как мы можем видеть в исходном коде ниже (нет проверки на IsAvailable).
Вы можете посмотреть источник , чтобы узнать, что произойдет:
/// <summary>
/// Gets a setting with the given name.
/// </summary>
/// <param name="name">Setting name.</param>
/// <returns>Setting value or null if such setting does not exist.</returns>
internal string GetSetting(string name)
{
Debug.Assert(!string.IsNullOrEmpty(name));
string value = null;
value = GetValue("ServiceRuntime", name, GetServiceRuntimeSetting);
if (value == null)
{
value = GetValue("ConfigurationManager", name, n => ConfigurationManager.AppSettings[n]);
}
return value;
}
Как вы можете видеть, есть только один вызов обычного класса ConfigurationManager, который просто обращается к AppSettings.