如何使CloudConfigurationManager.GetSetting更简洁?

时间:2012-10-11 10:11:54

标签: c# azure

我目前正在使用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=...

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

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

8 个答案:

答案 0 :(得分:11)

不是真的。如果您查看基础GetValue方法的代码,您会看到:

private static string GetValue(string providerName, string settingName, Func<string, string> 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。现在您可以简单地删除应该禁止所有消息的默认侦听器:

  <system.diagnostics>
    <trace>
      <listeners>
        <remove name="Default" />
      </listeners>
    </trace>
  </system.diagnostics>

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

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

注意:CloudConfigurationManager的功能远不止这些,例如加载没有程序集引用的程序集。

答案 1 :(得分:11)

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

答案 2 :(得分:1)

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

var oldListeners = Trace.Listeners.Cast<TraceListener>().ToArray();
Trace.Listeners.Clear();

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

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

答案 3 :(得分:1)

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

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

为:

message = "PASS";

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

答案 4 :(得分:0)

我们自己也遇到过这种情况......非常令人沮丧。

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

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

希望有所帮助, 大卫

答案 5 :(得分:0)

我遇到了类似的问题。我从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(通过反射)的方式。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

这里有两个不同的问题:

  1. 设置值以纯文本格式记录(安全问题)
  2. 每次记录消息 检索设置(详细程度问题)
  3. 正如其他人所说,#1已在更新版本的插件中得到修复。

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

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

    离开the diagnostic config file schema,我解决问题#2的方法是将通用追踪的最低严重程度(例如警告,信息,详细)限制为&#34;信息&#34; (或更严重)并确保我自己的日志记录没有使用&#34;详细&#34;水平。

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

    原件:

    <Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Verbose" />
    

    修正:

    <Logs scheduledTransferPeriod="PT1M" scheduledTransferLogLevelFilter="Information" />