从ServiceRuntime获取“StorageConnectionString”:失败

时间:2014-06-12 17:53:44

标签: azure connection-string

我以编程方式连接到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>
...

连接有效。但是我看到了消息&#34; Getting&#34; StorageConnectionString&#34;来自ServiceRuntime:FAIL &#34;在我当地的单位测试中:

enter image description here

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

3 个答案:

答案 0 :(得分:10)

我遇到了与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);

答案 1 :(得分: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的appSetting部分或app.config中添加设置。

的web.config

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

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

答案 2 :(得分:0)

CloudConfigurationManager.GetSetting函数已重载,默认情况下,它将把其结果写入跟踪日志。

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

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

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

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

旁注: 您可能要考虑使用默认实现创建一个IConfigFileProvider,该默认实现通过键名访问.config文件值。然后,您可以创建一个二级实现以在单元测试(或其他位置)中使用,该实现使用字典来存储值。根据您在做什么,您可能会使用其中一个。

在IConfigFileProvider中,您将定义一些函数,这些函数将使用默认值按名称自动返回设置,将类型转换为(例如,转换为int),如果找不到该值,则抛出异常。

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