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.