【问题标题】:Getting "StorageConnectionString" from ServiceRuntime: FAIL从 ServiceRuntime 获取“StorageConnectionString”:失败
【发布时间】:2014-06-12 17:53:43
【问题描述】:

我以编程方式连接到 Blob 存储:

string connectionString = CloudConfigurationManager.GetSetting("StorageConnectionString");
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
...

我的App.Config 设置是:

<configuration>
  <appSettings>
    <add key="StorageConnectionString"
         value="DefaultEndpointsProtocol=http;AccountName=ACNAME;AccountKey=MYKEY==" />
  </appSettings>
...

连接有效。但是,我在本地单元测试中看到消息“Getting "StorageConnectionString" from ServiceRuntime: FAIL”:

此消息的原因是什么以及如何解决?

【问题讨论】:

    标签: azure connection-string


    【解决方案1】:

    我在使用 Azure 表存储时遇到了同样的问题,但一切正常。

    添加到您的 web.config :

    <connectionStrings>
        <add name="ConnectionTableAzure" connectionString="DefaultEndpointsProtocol=https;AccountName=[ACCOUNTNAMEHERE];AccountKey=[ACCOUNTKEYHERE];TableEndpoint=[ENDPOINTHERE]"/>
    </connectionStrings>
    

    替换:

    storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("ConnectionTableAzure"));
    

    通过这个:

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

    【讨论】:

      【解决方案2】:

      以前的解决方案有效,但我想对此进行更多扩展。

      即使代码在生产环境中运行,它也会替换值,但有时您确实希望让 Azure 处理配置,同时在调试时保持对输出窗口的控制。

      我创建了以下类来帮助解决这个问题。

      public static class CloudConfigurationManagerExt
      {
          public static string GetSetting(string configurationValue)
          {
      #if DEBUG
              return System.Configuration.ConfigurationManager.AppSettings[configurationValue];
      #else
              return Microsoft.Azure.CloudConfigurationManager.GetSetting(configurationValue);
      #endif
          }
      }
      

      然后我将所有对 CouldConfigurationManager.GetSetting 的调用更改为我的。

      来自

      string connStr = CloudConfigurationManager.GetSetting("Microsoft.AzureBlobStorage.ConnectionString");
      

      string connStr = CloudConfigurationManagerExt.GetSetting("Microsoft.AzureBlobStorage.ConnectionString");
      

      并根据需要在 web.config 或 app.config 的 appSetting 部分添加设置。

      web.config

      <add key="Microsoft.AzureBlobStorage.ConnectionString" value="YourValueHere" />
      

      如您所见。如果您在调试模式下运行,它会从 appsetting 中获取值,否则遵循 CloudConfigurationManager.GetSetting 的常规路径

      【讨论】:

        【解决方案3】:

        CloudConfigurationManager.GetSetting 函数已重载,默认情况下会将其结果写入 Trace 日志。

        以下重载将阻止这些消息:

        var connStr = CloudConfigurationManager.GetSetting("StorageConnectionString", false);
        

        假设该值位于 appSettings 中,另一种选择是通过常规 ConfigurationManager 直接访问它。

        var connStr = System.Configuration.ConfigurationManager.AppSettings["StorageConnectionString"];
        

        旁注: 您可能需要考虑创建一个具有默认实现的 IConfigFileProvider,该实现通过键名访问 .config 文件值。然后,您可以创建一个辅助实现以在您的单元测试(或其他地方)中使用,该实现使用字典来存放值。根据您的操作,您可能会使用其中一种。

        在 IConfigFileProvider 中,您可以定义按名称自动返回设置、使用默认值、类型转换(例如,转换为 int)或在未找到值时抛出异常的函数。

        我使用这种方法,效果非常好。它允许您在不使用完全不同的项目的情况下测试不同的配置值设置,同时不会强迫您对可能已经依赖于配置文件的类库进行更改。只要您始终从 IConfigFileProvider 检索 .config 设置,就可以了。

        【讨论】:

          猜你喜欢
          • 2013-07-20
          • 1970-01-01
          • 2019-07-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多