Azure Blob Storage“未找到有效的帐户信息组合”

29

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

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

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

No valid combination of account information found. at Microsoft.WindowsAzure.Storage.CloudStorageAccount.b__0(String err) at Microsoft.WindowsAzure.Storage.CloudStorageAccount.TryParse(String s, CloudStorageAccount& accountInformation, Action`1 error) at Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(String connectionString) at MyProj.Controllers.ImageController.Upload(ImageViewModel model)

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

我用于连接到Blob存储的代码直接来自Azure how-to文档:

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

再次强调,当我在本地开发环境上运行时,这个文件上传功能可以正常工作,没有任何问题。但是当我部署应用到服务器上并尝试做同样的事情时,它就给了我这个错误。

我猜测我的存储连接字符串在 web 部署发布过程中出了问题,但我不确定该怎么解决?


将存储连接字符串存储在AppSettings中,而不是ConnectionStrings部分。此外,将实际的连接字符串粘贴在这里将有助于我们为您提供帮助(您可以用***表示帐户密钥)。 - astaykov
好的,我已经将连接字符串移到了 AppSettings 中,现在它正常工作了。真奇怪!感谢你的帮助 :) - Oliver Tomlinson
1
那么,@astaykov - 你考虑重新发布为答案,这样oTomo就可以标记了... :) - David Makogon
1
这个错误被解决了,感觉有点奇怪。最终CloudStorageAccount.Parse使用同样的连接字符串被调用,因此它应该正常工作... - Sandrino Di Mattia
15个回答

36

请确保:

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

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

(注意分号后的空格)

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

---编辑----

实际上,将“https”加入其中会使一切都混乱了。工作角色会抛出异常(“由于意外的数据包格式,握手失败。”),然后在未知状态和销毁之间循环。去掉“https”中的“s”,并确保没有空格,问题就解决了。


1
注意:这仅适用于使用计算模拟器 2.0 或更高版本的开发人员。 - Scott Decker
1
我在“= true”之间加了空格 - 我想是当我将其复制并粘贴到引号中之前,VS引入了它们,并且我没有注意到! - Ian Robertson
3
去掉空格对我有用。谢谢!好的教程:http://www.codeproject.com/Articles/490178/How-to-Use-Azure-Blob-Storage-with-Azure-Web-Sites - Tormod Haugene
2
我不知道空格会成为问题!! 去掉空格解决了这个问题。谢谢! - ecasper
1
为我工作。修剪连接字符串。 - ossentoo
显示剩余5条评论

19

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

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

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


3
类StorageCredentials现在是抽象类,请使用类StorageCredentialsAccountAndKey。 - ahaliav fox

17

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


1
我尝试过了,但仍然遇到了“未找到有效的帐户信息组合”的错误。我的连接字符串键/值是key="StorageConnectionString" value="DefaultEndpointsProtocol=https;AccountName=;AccountKey=;BlobEndpoint=customEndpoint"。 var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]); - Thabiso Mofokeng
2
为什么这会有任何区别呢?最终它只是一个字符串,而且 ConfigurationManager.ConnectionStrings["StorageConnectionString"].ConnectionString 对我来说完全可以正常工作...不用说,将其保存为连接字符串更有意义。 - Ohad Schneider
3
是的,Ohad,可能是这样。但在2012年时,Configuration Manager的连接字符串提供程序还不了解Azure存储连接字符串,当问题被发布并回答时...... - astaykov
1
请检查开始和结束引号。 - Martin Kulov

7

我之前因为错过了 BlobEndpoint= 前缀,导致出现了这个错误,该前缀应该位于 Blob SAS URL 之前:

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"
  }
}

3

我认为这不可能是问题的原因,正如Sandino Di Mattia所说。当我将SDK升级到2.0时,出现了同样的问题,后来发现API的连接字符串解析器在连接字符串中不能容忍更多的空格,并且没有任何地方提到这一点。如果这种改变是有意的,我会称之为一个恶毒的举动...


很不幸,我也遇到了同样的问题,尝试连接到 Azure 队列。字符串在应用程序设置中,但是字符串中没有空格 :( - Joel Martinez

2

请注意,连接字符串中的大小写很重要。我曾经遇到过这种错误,因为一个大型合并导致有人在我的Web.config中将"AccountName"更改为"Accountname"。使用正确的大小写可以解决此错误。


1
如果您非常确信从Azure服务复制的连接字符串与您粘贴的相同,那么请检查是否出于可读性的考虑给出了回车符/空格。这也是您遇到的问题之一。我试图为@scottndecker点赞,但由于我的声望不够15而无法执行此操作。

0

我也遇到了同样的问题,后来发现是命名空间的问题。CloudStorageAccount类同时存在于两个命名空间中。

using Microsoft.WindowsAzure;

using Microsoft.WindowsAzure.Storage;

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

修正后的代码:

using Microsoft.WindowsAzure.Storage;

0

要解决 Azure 上的这个问题,不要使用默认字符串,而是使用最简版本,例如:

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

没有空格或换行!!


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接