20

我有一个包含一些 Azure 助手类的库。在这些帮助程序类中,我获得了 Azure 帐户名称和密钥等设置。在 Azure 中运行时,这些设置是从云配置文件 (cscfg) 中获取的。这一切都很好。

为了在 Azure 之外对这些类(特别是 RoleEnvironment)进行单元测试,我在单元测试项目中创建了相同变量名称的设置。这些实际上保存在 app.config 文件中,并通过我的测试项目的属性部分下的设置部分进行编辑。我决定使用 CloudConfigurationManager 类,而不是创建我自己的从 web.config/app.config 设置中抽象云配置设置的方法。但是,当我运行单元测试时,我的任何设置都没有被拾取,所以我只是得到空值。但是,如果我将 app.config 文件更改为使用下面“appSettings”格式的设置,那么我确实会得到有效值。这样做的缺点是我无法再使用 Visual Studio 中的设置编辑器页面来编辑我的设置。

所以我的问题是我做错了什么或者这是云配置管理器的限制,它只能选择手动添加的 appSettings 而不是使用编辑器添加的 applicationSettings?

<appSettings>
    <add key="Foo" value="MySettingValue"/>
</appSettings>

以上有效,而以下无效:

<applicationSettings>
    <ComponentsTest.Properties.Settings>
      <setting name="Foo" serializeAs="String">
        <value>MySettingValue</value>
      </setting>
    </ComponentsTest.Properties.Settings>  
</applicationSettings>
4

1 回答 1

34

CloudConfigurationManager 仅支持 web.config/app.config 的AppSettings部分,如果 Azure 配置中缺少该设置,它将尝试从此处读取值。文档指出,如果属性 RoleEnvironment.IsAvailable 为true(在 Azure 中运行),它将不会读取 web.config/app.config ,但正如我们在下面的源代码中看到的那样,这是不正确的(不检查 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

于 2012-07-23T11:30:02.967 回答