azure blob 存储“找不到有效的帐户信息组合”

Posted

技术标签:

【中文标题】azure blob 存储“找不到有效的帐户信息组合”【英文标题】:azure blob storage "No valid combination of account information found" 【发布时间】:2012-12-04 12:21:52 【问题描述】:

我有一个使用 Azure 网站预览运行的 MVC4 项目。

我的问题是,当我将网站部署到 azure 时,我无法将 blob 上传到我的 blob 存储容器中,但是当我在本地调试时上传工作正常。

这是我在部署时得到的异常和堆栈跟踪,我尝试上传到容器:

找不到有效的帐户信息组合。在 Microsoft.WindowsAzure.Storage.CloudStorageAccount.b__0(字符串错误)在 Microsoft.WindowsAzure.Storage.CloudStorageAccount.TryParse(字符串 s, CloudStorageAccount& accountInformation,Action`1 错误)在 Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(字符串 连接字符串)在 MyProj.Controllers.ImageController.Upload(ImageViewModel 模型)

特别是根据堆栈跟踪,它是失败的 .Parse 方法。

我用来连接到 blob 存储的代码直接来自 azure how-to 文档:

string connectionString = ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString;
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();

再次,当我在我的开发盒上本地运行时,这工作正常,我可以毫无问题地成功上传。然而,它在部署时给了我这个错误,我尝试做同样的事情。

我猜我的 storageConnectionString 在网络部署发布过程中被弄乱了,但我不确定如何解决这个问题?

【问题讨论】:

将您的存储连接字符串存储在 AppSettings 中,而不是 ConnectionStrings 部分。而且,在此处粘贴实际的连接字符串将有助于我们为您提供帮助(您可以将 *** 用作帐户密钥)。 好的,我已经将连接字符串移到 AppSettings 中,现在可以正常工作了。奇怪!感谢您的帮助:) 那么,@astaykov - 转发作为答案怎么样,所以 oTomo 可以这样标记... :) 这修复了错误有点奇怪。最后CloudStorageAccount.Parse 是用相同的连接字符串调用的,所以它应该可以正常工作...... 【参考方案1】:

确保

1) 您正在使用正确的诊断协议(双击角色 -> 配置选项卡 -> 选择配置 -> 在“诊断”下,单击省略号 -> 尝试单击确定...如果它给出错误您必须使用 https,将连接字符串更改为 https)

2) 不允许有空格...即 UseDevelopmentStorage=true;DevelopmentStorageProxyUri=https://127.0.0.1 代替 UseDevelopmentStorage=true; DevelopmentStorageProxyUri=https://127.0.0.1

(注意分号后的空格)

在“设置”选项卡上检查所有连接字符串中的 https 和空格

---编辑----

添加“https”实际上让我们搞砸了一切。 Worker 角色会抛出异常(“Handshack 由于意外的数据包格式而失败。”),然后在未知和销毁之间循环。删除了“https”中的“s”,并确保没有空格,瞧。

【讨论】:

注意:这只发生在使用 Compute Emulator 2.0 或更高版本的开发人员身上。 我在 "= true" 之间有空格 - 我认为 VS 在我复制和粘贴时引入了它们,然后再包含语音标记,我没有注意到! 删除空格对我有用。谢谢!好教程:codeproject.com/Articles/490178/… 我不知道空格会是个问题!!删除空格已经解决了这个问题。谢谢! 为我工作。修剪连接字符串【参考方案2】:

获取 CloadStorageAccount 实例的另一种方法是这样做

StorageCredentials credentials = new StorageCredentials(accountName, accountKey);
CloudStorageAccount storageAccount = new CloudStorageAccount(credentials, true);

这应该可以帮助遇到此解析问题的任何人。

【讨论】:

StorageCredentials 类现在是抽象类,请改用 StorageCredentialsAccountAndKey 类【参考方案3】:

将您的存储连接字符串存储在 AppSettings 中,而不是 ConnectionStrings 部分。而且,在此处粘贴实际的连接字符串将帮助我们帮助您(您可以将 * 用于帐户密钥)。

【讨论】:

我试过了,但仍然收到“找不到有效的帐户信息组合”错误。我的连接字符串键/值是 key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=***;AccountKey=***;BlobEndpoint=customEndpoint"。 var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]); 为什么会有任何不同?最后它只是一个字符串,ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString 对我来说工作得很好......不用说,将它保存为连接字符串更有意义。 是的,哦,可能。但不是在 2012 年,当配置管理器的连接字符串提供者不知道 Azure 存储连接字符串时,当问题发布回答时...... 还要检查开始和结束引号。【参考方案4】:

我认为,这不是 Sandino Di Mattia 所表达的问题的原因。我在将 SDK 升级到 2.0 时也遇到了同样的问题,结果发现 API 的连接字符串解析器不再允许连接字符串中出现空格,并且在任何地方都没有提到它。如果这种改变是故意的,我会称之为讨厌的举动......

【讨论】:

不幸的是,我在尝试连接到 azure 队列时遇到了同样的问题。该字符串在应用程序设置中,并且在字符串中找不到空格:(【参考方案5】:

我收到此错误是因为错过了 Blob SAS URL 之前的前缀 BlobEndpoint=

错误的appsettings.json


  "TestBlobWriter": 
    "ConnectionString": "https://test.blob.core.windows.net/test-container?sp=*&st=*&se=*&spr=*&sv=*&sr=*&sig=*",
    "ContainerName": "test-container"
  

正确的appsettings.json


  "TestBlobWriter": 
    "ConnectionString": "BlobEndpoint=https://test.blob.core.windows.net/test-container?sp=*&st=*&se=*&spr=*&sv=*&sr=*&sig=*",
    "ContainerName": "test-container"
  

【讨论】:

【参考方案6】:

请注意,连接字符串中的大小写也很重要。在大型合并导致某人在我的 Web.config 中将“AccountName”更改为“Accountname”之前,我遇到了此错误。使用正确的大小写修复了错误。

【讨论】:

【参考方案7】:

如果您非常确定,从 Azure 服务复制的连接字符串与您粘贴的相同,请检查您是否给了任何回车/空格以方便阅读,这也是导致该问题的原因之一你所经历的。 我试图为 @scottndecker 提供 +1,但因为我没有 15 声望,所以不能。

【讨论】:

【参考方案8】:

使用 proxyUri 时不要忘记包含“https://”或“https://”。 喜欢:

UseDevelopmentStorage=true;DevelopmentStorageProxyUri=https://127.0.0.1

【讨论】:

【参考方案9】:

我得到这个是因为我不小心在字符串的末尾添加了一个换行符 (\r\n)。

【讨论】:

【参考方案10】:

我遇到了同样的问题。您需要使用Microsoft.WindowsAzure.Storage 命名空间并确保连接字符串中没有多余的空间。

【讨论】:

【参考方案11】:

我收到此错误是因为我使用了错误的 nuget 包, (我使用的是点网 4.6.1)

错误的包是: WindowsAzureStorage.Helper

正确的包是: WindowsAzure.Storage

并确保您使用命名空间: 使用 Microsoft.WindowsAzure.Storage;

【讨论】:

我认为提问者没有从那个错字中得到错误。【参考方案12】:

当我使用 @Microsoft.KeyVault(SecretUri=https...) 将存储连接字符串从应用设置字面量迁移到 keyvault 引用时遇到此错误 我创建了一个新的函数应用程序,却忘记打开系统分配的身份并授予该应用程序对 keyvault 的访问权限。因此,症状是未定义的应用设置值 - 存储连接尝试失败。

【讨论】:

【参考方案13】:

我将分享我的问题的解决方案。我在想括号必须保留并在其中输入信息。去掉括号后,我的问题就解决了。

发件人:

string eventHubName = "Event Hub name";

收件人:

string eventHubName = "Event Hub name";

同样适用于:eventHubConnectionString、storageAccountName 和 storageAccountKey

【讨论】:

谢谢@SurajRao 的评论,现在好些了吗?【参考方案14】:

要在 azure 上解决此问题,请不要使用默认字符串,而是使用简约版本,例如:

<add name="StorageConnection" 
    connectionString="DefaultEndpointsProtocol=https;AccountName=name;AccountKey=yourkey;EndpointSuffix=core.windows.net" />

没有空格或换行符!!

【讨论】:

【参考方案15】:

错误消息没有说明帐户密钥错误,但这是我的问题。

我正在开发一个新应用程序,并从我们团队的配置文件中复制/粘贴了密钥。我开始在新应用程序中遇到此错误,但唯一一个工作正常。事实证明,在我们的配置文件中,+\u002B 替换。复制/粘贴正确的密钥后,新应用运行良好。

【讨论】:

【参考方案16】:

我也遇到了同样的问题,我在命名空间中找到了它。 CloudStorageAccount 类存在于两个命名空间中

using Microsoft.WindowsAzure;

using Microsoft.WindowsAzure.Storage;

所以我只是删除了WindowsAzure 命名空间并在我的代码中添加了WindowsAzure.Storage

以前的代码:

using Microsoft.WindowsAzure;

固定代码:

using Microsoft.WindowsAzure.Storage;

【讨论】:

以上是关于azure blob 存储“找不到有效的帐户信息组合”的主要内容,如果未能解决你的问题,请参考以下文章

使用 azure-storage-blob 或 azure-storage 上传和删除 Azure 存储 Blob

仅从 Azure 存储 [Azure-Blob][REST] 中的 Blob 列表获取特定元数据

如何使用 C# 中的 Azure.Storage.Blobs 从 Azure 存储 Blob 以 ByteArray 格式获取文件

Azure 存储:Blob:Python:获取指示符是不是存在 Blob

请求令牌时如何在 Azure 存储 Blob 中为 REST 请求指定范围? [AZURE-BLOB][REST API]

无法使用 Azure.Storage.Blobs NuGet 包将文件上传到 Azure Blob 存储