如何使CloudConfigurationManager.GetSetting更简洁?

我目前正在使用CloudConfigurationManager.GetSetting("setting")来获取我的应用程序的设置,但它正在将其检查的所有内容的日志写入控制台(在Debug和Release中):

 Getting "setting" from ServiceRuntime: FAIL. Getting "setting" from ConfigurationManager: PASS (Data Source=... Getting "setting" from ServiceRuntime: FAIL. Getting "setting" from ConfigurationManager: PASS (Data Source=... 

有没有办法阻止它这样做,或者一个不那么冗长的替代版本?

大多数情况下,我只是喜欢我的unit testing输出很干净,但我也有点担心它会在生产服务器上以纯文本forms打印连接字符串(以及密码)等内容。

并不是的。 如果你看一下底层GetValue方法的代码,你会看到:

 private static string GetValue(string providerName, string settingName, Func getValue) { string str1 = getValue(settingName); string str2; if (str1 != null) str2 = string.Format((IFormatProvider) CultureInfo.InvariantCulture, "PASS ({0})", new object[1] { (object) str1 }); else str2 = "FAIL"; Trace.WriteLine(string.Format((IFormatProvider) CultureInfo.InvariantCulture, "Getting \"{0}\" from {1}: {2}.", (object) settingName, (object) providerName, (object) str2)); return str1; } 

始终调用Trace.WriteLine而不考虑Debug或Release。 现在您可以简单地删除应该禁止所有消息的Default侦听器:

         

现在,如果您查看CloudConfigurationManager它就不会那么做。 如果这对你来说是一个问题,你可以自己做点什么,从这开始:

  if (RoleEnvironment.IsAvailable) return RoleEnvironment.GetConfigurationSettingValue(setting); else return ConfigurationManager.AppSettings[setting]; 

注意:CloudConfigurationManager比这更多,例如加载没有程序集引用的程序集。

CloudConfigurationManager.GetSetting现在有一个方法重载,带有一个名为outputResultsToTrace的参数。

如果您将false传递给此方法,那么它将禁用其他地方使用的Trace.WriteLine以“垃圾” Trace日志。

所以

 var mySetting = CloudConfigurationManager.GetSetting("MySetting"); 

 var mySetting = CloudConfigurationManager.GetSetting("MySetting", false); 

我通过直接查看GitHub上的源代码找到了这个: https : //github.com/Azure/azure-sdk-for-net/blob/52fc67253a176bea01c37c164f71c7eba8eaedba/src/Common/Configuration/CloudConfigurationManager.cs#L35

值得一提的是,这个过载没有记录: https : //msdn.microsoft.com/en-us/library/azure/mt634648.aspx

所以我不确定它是否是API的官方和支持部分,或者它是否会在将来发生变化或消失。

此更改于2015年底完成: https : //github.com/Azure/azure-sdk-for-net/commit/e14398136d7d3b6d5e4675f1e8ccbdd37a8c6b01

备选方案,如果您在一个部分中调用CloudConfigurationManager.GetSetting()(即包装器/辅助类):

 var oldListeners = Trace.Listeners.Cast().ToArray(); Trace.Listeners.Clear(); var stringValue = CloudConfigurationManager.GetSetting(key); Trace.Listeners.AddRange(oldListeners); 

首先,我们删除Trace上的所有侦听器。 然后我们抓取设置,并重新添加监听器。 当然,这可能会导致线程应用程序出现问题

我刚刚安装了nuget包 Microsoft.WindowsAzure.ConfigurationManager 3.1.0版,我可以确认此版本中已修复该问题。 看一下问题评论中引用的github问题 ,我们可以看到,在更改日志中 ,获取的值不再写入跟踪输出。 特别是,跟踪消息已更改为:

 message = string.Format(CultureInfo.InvariantCulture, "PASS ({0})", value); 

至:

 message = "PASS"; 

这仍然使配置管理器非常冗长。

我们自己碰到了这个…非常令人沮丧。

我们无法删除默认侦听器,因为我们正在记录它们自己的东西。

但是有一个简单的解决方法。 只需使用老式的ConfigurationManager.AppSettings["Microsoft.ServiceBus.ConnectionString"] ,您将获得所需的信息,而无需烦人的日志记录。

希望有所帮助,大卫

我遇到了类似的问题。 我从Azure SDK 2.0更新到2.2 – 在此过程中,我使用NuGet Manager将Microsoft.WindowsAzure.Storage更新为最新版本。 PackageManager自动将Microsoft.WindowsAzure.Configuration转换为1.8.0.0。 我无法运行(这是.Net 2.0!?)。 手动设置所有引用后

  • Microsoft.WindowsAzure.Storage 2.1.0.0
  • Microsoft.WindowsAzure.Configuration 2.0.0.0

一切顺利。

我认为这是因为CloudConfigurationManager.GetSetting加载程序集并调用funktions(通过reflection)的方式。

已在3.0.0版中修复。 请更新Microsoft Azure Configuration Manager nuget包。

这里有两个不同的问题:

  1. 设置值以纯文本格式记录(安全问题)
  2. 每次检索设置时都会记录消息(冗长问题)

正如其他人所说,#1已在更新版本的插件中得到修复。

根据我的经验(以及其他一些回复),#2仍然是一个巨大的烦恼。

在Visual Studio的队列编辑器中查看WADLogsTable,请注意消息级别为5(即详细信息 ,根据此ETW级别列表 )。

离开诊断配置文件架构 ,我解决问题#2的方法是将通用跟踪的最低严重性级别(例如警告,信息,详细)限制为“信息”(或更严重),并确保我自己的日志记录确实不要使用“详细”级别。

以下是我在diagnostics.wadcfgx中所做的更改:

原版的:

  

固定: