2012-07-23 30 views
15

回暖的applicationSettings我有一个包含一些Azure的辅助类的库。在这些助手类中,我获得了诸如Azure帐户名和密钥之类的设置。在Azure中运行时,这些设置将从云配置文件(cscfg)中提取。这一切工作正常。CloudConfigurationManager不从的app.config

为了单元测试天青以外这些类(特别是RoleEnvironment)我单元测试项目中产生的相同的变量名的设置。这些实际上被保存在一个app.config文件中,并通过位于我的测试项目的属性部分下的设置部分进行编辑。我没有创建我自己的从web.config/app.config设置中抽象云配置设置的方法,而是决定使用CloudConfigurationManager类。然而,当我运行我的单元测试时,我的设置都没有被拾取,所以我只是得到空值。但是,如果我将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> 

回答

30

的CloudConfigurationManager只支持的AppSettings在web.config/app.config中的一部分,并会尝试从这里读值如果该设置从Azure配置中丢失。该文件指出,它不会读取的web.config /的app.config如果属性RoleEnvironment.IsAvailable是(在Azure中运行),但是这是不正确我们可以在下面的源代码中看到(不检查IsAvailable)。

你可以看看source来看看会发生什么:

/// <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的电话。

+4

可能一厢情愿,但它本来很高兴的是微软的文档实际上说明这一点。谢谢回复。 – 2012-07-23 12:16:35

+0

+1很好地完成。我曾计划将它用于连接字符串。 – 2012-07-23 12:47:17

+0

@KingRoger,它的[MSDN文章](https://msdn.microsoft.com/en-us/LIBRARY/microsoft.windowsazure.cloudconfigurationmanager)关于类中所述。 – 2015-06-25 10:10:21