2012-07-23 33 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