【问题标题】:CloudConfigurationManager.GetSetting returning nullCloudConfigurationManager.GetSetting 返回 null
【发布时间】:2013-03-01 07:42:36
【问题描述】:

按照说明here我有:

var connectionString = CloudConfigurationManager.GetSetting("StorageConnectionString");

但是connectionString 是null,这是我的app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
  </startup>
  <connectionStrings>
    <add name="StorageConnectionString"
         connectionString="DefaultEndpointsProtocol=https;AccountName=storage;AccountKey=key" />
  </connectionStrings>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.2.0.0" newVersion="5.2.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

【问题讨论】:

    标签: c# azure app-config azure-storage


    【解决方案1】:

    确保您的所有参考文献都是同步的。有 2012-06 库和 2012-10 将它们设置为 Copy Local = true 并验证 SDK 版本。我处理了完全相同的事情,让我发疯。

    【讨论】:

    • 您是通过 NuGet 安装的吗?我做到了,我有 Microsoft.WindowsAzure.Storage v2.0.0.0 (.net 4.0) 和 Microsoft.WindowsAzure.Configuration v1.8.0.0 (.net 3.5) 听起来有问题吗?
    • 我升级到了 Windows Azure SDK for .NET - 2.0。自动升级天蓝色项目后,它也没有找到配置字符串。在手动将所有对 Microsoft.WindowsAzure.Configuration 的引用更新到版本 2.0.0.0(它们是 1.8.0.0)后,它就可以工作了。
    • @weston 抱歉回复晚了……是 OOtown 吗……你解决了吗?
    • @SocialMitch 你去了面向对象的小镇?这听起来比乐高乐园好。我迫不及待想带孩子去那里
    【解决方案2】:

    这行得通,即使评论不合适,因为我确实有一个 CloudConfigManager 的参考:

    如果您正在创建一个没有引用 Microsoft.WindowsAzure.CloudConfigurationManager 的应用程序,并且您的连接字符串位于 web.config 或 app.config 中,如上所示,那么您可以使用 ConfigurationManager 来检索连接字符串。您需要在项目中添加对 System.Configuration.dll 的引用并为其添加另一个命名空间声明:

    using System.Configuration;
    
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
        ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString);
    

    【讨论】:

    • 我不明白为什么这个答案被标记为正确。发布的问题引用 CloudConfigurationManager,但此解决方案使用 ConfigurationManager。它们不是同一件事。在我看来,Nikolai Joukov 对这个问题的回答是正确的。
    • @Nathan 虽然 Nikolai 的回答可能会解释问题所在,但它缺少任何解决方案。
    【解决方案3】:

    我遇到了同样的问题。我已更新项目以使用 Azure SDK 2.0。我为我的 Web 角色和辅助角色更新了 NuGet 包,但 Visual Studio 中的 Azure 项目仍使用旧版本。

    要解决此问题,请右键单击您的 Azure 项目并选择“属性”。在“应用程序”选项卡下,您将看到一个用于更新您的 Azure SDK 的按钮。

    【讨论】:

    • 下载并安装 sdk 后,升级按钮才可用(使用 web 平台安装程序很容易做到)
    【解决方案4】:

    根据 MSDN http://msdn.microsoft.com/en-us/library/windowsazure/microsoft.windowsazure.cloudconfigurationmanager.aspx 中的文档

    CloudConfigurationManager 只能读取 appSettings 标签中的配置设置。如果您的配置设置在不同的标签内,调用 GetSetting 将返回 Null。

    【讨论】:

      【解决方案5】:

      这对我有用...

      using System.Configuration;
      

      ...

      var connectionString = ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString;
      

      【讨论】:

        【解决方案6】:

        当我将 Azure SDK 升级到 2.2 版时发生了这种情况。

        为了修复它,我更改了 packages.config 以使用更新版本的 Azure ConfigurationManager。

        <package id="Microsoft.WindowsAzure.ConfigurationManager" version="2.0.1.0" targetFramework="net45" />
        

        【讨论】:

          【解决方案7】:

          我也遇到过类似的问题。我从 Azure SDK 2.0 更新到 2.2 - 在此过程中,我使用 NuGet 管理器将 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 加载程序集并调用函数(通过反射)的方式。

          【讨论】:

            【解决方案8】:

            按照本教程:

            您可以像这样获得配置设置:

            RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString")
            

            【讨论】:

            • 这为我解决了问题。在 Azure v2.5 中,CloudConfigurationManager.GetSetting 调用可能不再查看云配置。
            【解决方案9】:

            我在将 Azure SDK 从 2.0 升级到 2.2 后得到了这个。我能够通过以下方式修复:

            1. 右键单击 Azure 项目并选择属性。根据应用程序选项卡更新 Azure SDK。 (感谢 rattrick 的回答)。
            2. 右键单击以管理 NuGet 包。在左侧单击更新并更新 WindowsAzure.ConfigurationManager。

            【讨论】:

              【解决方案10】:

              遇到了同样的问题。不要使用连接字符串,而是使用 configuration->appSettings->add 像这样的键...

              <configuration>
                  <appSettings>
                      <add key="StorageConnectionString" value="[ConnectionStringHere]" />
                  </appSettings>
              </configuration>
              

              【讨论】:

              • 这不是答案
              • 这就是我的答案。我在 Azure 项目设置中有连接字符串,它突然停止为我工作,没有任何我能想到的解释(没有更新 SDK 或 nuget 包等)。将 appSetting 添加到 Web.config 也对我有用。感谢您的帮助
              • 很高兴确认此建议在 2017 年 7 月仍然有效。使用 VS2017(预览版 15.3)和新创建的空白 Azure Cloud/ASP.NET WebApp .Net 4.6 CloudConfigurationManager.GetSetting(..)方法在本地运行时获取 Web.config 文件设置。在从 VS2017 中发布到 Azure 之后,相同的代码从通过 Azure 门户声明的单独应用服务设置中获取设置值。我使用不同的值更改了 Azure 门户设置以确认,然后再次从 VS2017 重新发布 Web 应用程序以确保 Azure 设置值未被覆盖。
              【解决方案11】:

              将 Azure SDK 从 2.2 升级到 2.3 后也是如此。:

              右键单击 Azure 项目选择属性。在“应用程序”选项卡中单击“升级...”(感谢 rattrick 的回答)。

              然后还有一个错误需要解决: 尝试在 Compute Emulator 中运行 Azure 项目引发了异常: System.Configuration.ConfigurationErrorsException 未处理 消息:Microsoft.WindowsAzure.ServiceRuntime.dll 中出现“System.Configuration.ConfigurationErrorsException”类型的未处理异常 附加信息:konnte nicht erstellt werden。

              在VS2013的“错误列表”窗口中出现如下警告:

              发现同一依赖程序集的不同版本之间存在冲突。在 Visual Studio 中,双击此警告(或选择它并按 Enter)以修复冲突;否则,将以下绑定重定向添加到应用程序配置文件中的“运行时”节点:C:\Program Files (x86)\MSBuild\12.0\bin\Microsoft.Common.CurrentVersion.targets 1635

              我让 VS 解决了这个警告,一切正常。

              【讨论】:

                【解决方案12】:

                我遇到了同样的问题(两次)。 即使在重新启动 Visual Studio 和重新启动 Azure 模拟器之后,CloudConfigurationManager.GetSetting("SettingName") 也会返回 null。

                我确信它以前可以工作,并且我拥有最新的 SDK。

                所以解决方案是重新启动我的电脑,然后 CloudConfigurationManager.GetSetting("SettingName") 返回正确的值。

                【讨论】:

                • 重启也为我解决了问题
                【解决方案13】:

                我遇到了同样的问题。没有任何建议对我有用,但“问题”很简单。一个简单的人必须了解这个类是如何工作的。

                它不会进入您的 app.config / web.config 或您存储应用程序设置的任何位置。 CloudConfigurationManager 与 ServiceConfiguration.*.cscfg 和 ServiceConfiguration.csdef 一起使用。 .csdef 必须包含设置的定义,但不能包含 ConfigurationSettings 部分下的值。设置本身位于 .cscfg 文件中(在同一部分但包括值;我想双重定义的原因是确保云和本地配置具有相同的设置)。

                您可以通过在 Visual Studio 中右键单击您的角色并选择“属性”->“设置”来设置这些(如果是 StorageConnectionString,只需选择“您的订阅”,如果您的存储帐户已连接到云服务),或者通过手动编辑它们。如果你搞砸了设置,你会得到一个感叹号图标。

                就这么简单。

                【讨论】:

                  【解决方案14】:

                  在重新访问我的 Azure 解决方案(Web + Worker 角色)以更新 Azure 2.5 后,我遇到了同样的问题。查看CloudConfigurationManager.GetSetting 的帮助,如果它在云平台 (Azure) 下运行,它将从ServiceConfiguration.csfg 读取,如果作为.net Web 应用程序运行,则从应用程序或web.config 读取。

                  所以我的解决方法是简单地将启动项目改回 Azure 云项目,而不是 Web 项目。
                  我得到空值是因为它托管在错误的平台上并且从没有设置的.config 文件中读取。 (呸!)

                  【讨论】:

                    【解决方案15】:

                    根据我的理解,我想指出,如果您的云服务用完,CloudConfigurationManager.GetSetting 将查看 web.config。如果您在云服务中,它将查看 cscfg。

                    请参考这里 link.

                    【讨论】:

                      【解决方案16】:

                      这是一个旧线程,但如果上述方法无法解决问题,我想分享我的解决方案,然后确保在运行应用程序时 Azure Storage Emulator 正在运行;至少对我来说这发生了。对我来说,我必须创建一个类来处理这里提到的模拟器问题......

                      http://blog.simontimms.com/2013/08/28/configuration-settings-in-an-azure-worker-role/

                      class ConfigurationProvider
                      {
                          private static string GetStorageConnectionString(string name)
                          {
                              try
                              {
                                  return RoleEnvironment.GetConfigurationSettingValue(name);
                              }
                              catch (SEHException)
                              {
                                  return System.Configuration.ConfigurationManager.ConnectionStrings[name].ConnectionString;
                              }
                          }
                      
                          public static string StorageConnectionString()
                          {
                              return GetStorageConnectionString("StorageConnectionString");
                          }
                      
                          public static string DefaultConnection()
                          {
                              return GetStorageConnectionString("DefaultConnection");
                          }
                      }
                      

                      【讨论】:

                        【解决方案17】:

                        在安装 Azure SDK 2.6(之前工作)后传递文字字符串时也得到一个空值。

                        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorage"].ConnectionString);
                        

                        替换了文字字符串,效果很好。

                           string connectionStr = "AzureStorage";
                        
                           var connectionstring = ConfigurationManager.ConnectionStrings[connectionStr].ConnectionString;
                        
                           CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionstring);
                        

                        【讨论】:

                          猜你喜欢
                          • 1970-01-01
                          • 1970-01-01
                          • 2015-08-19
                          • 1970-01-01
                          • 1970-01-01
                          • 2020-06-28
                          • 1970-01-01
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多