如何使 Azure 存储 (blob) 工作?

Posted

技术标签:

【中文标题】如何使 Azure 存储 (blob) 工作?【英文标题】:How do you make Azure storage (blob) work? 【发布时间】:2014-06-26 16:13:22 【问题描述】:

我使用 Azure blob 来存储图像。我在本地机器(使用模拟器)上进行了测试,它可以工作。如您所知,它使用类似

的 URI
http://127.0.0.1/xxx

但是在我部署到 Azure 之后,它就不起作用了。我有

(1) 将 StorageConnectionString 更改为指向 Azure blob(而不是本地模拟 blob)

(2) 将 blob 访问权限从“关闭”更改为“容器”

(3) 将此 blob 链接到我的网站

我想不出我还需要做什么才能让它发挥作用。

谁能帮帮我?

编辑:

更多信息:

在本地:

<add key="StorageConnectionString" value="DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1" />

在 Azure 上:

<add key="StorageConnectionString" value="DefaultEndpointsProtocol=http;AccountName=[myAccount];AccountKey=[myKey];BlobEndpoint=http://[myBolbName].blob.core.windows.net/" />

Azure 上的错误是(当我单击按钮上传图像时):

Application: 2014-05-09T07:45:12  PID[22228] Error       Unable to connect to the remote server
Application:    at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)
Application:    at Microsoft.WindowsAzure.Storage.Blob.CloudBlockBlob.UploadFromStreamHelper(Stream source, Nullable`1 length, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext)
Application:    at xxx.Utility.AzureStorageAccess.UploadBlob(Stream stream, String containerName, String blobRelativeURI, String& blobURI)
Application:    at xxx.xxx.xxx.btnSubmit_Click(Object sender, EventArgs e)

【问题讨论】:

您可以通过显示一些代码来帮助自己。 如果您要链接到您网站上的图片,您可能需要查看Azure CDN @BrendanGreen - 不知道您为什么要提出 CDN - 这与问题无关,因为问题不是询问如何优化客户端地理分布时公共 blob 访问的延迟。问题(虽然说明不佳)是关于正确使用 blob URI 的。 @martial - 你说的只是它不起作用。我们甚至不知道这意味着什么。正如约翰所说:展示你的代码。显示您正在使用的实际 URI(屏蔽您的唯一命名空间)。显示结果,或错误。显示 something. 就目前而言,您的问题无法回答。 @DavidMakogon:(3) 将此 blob 链接到我的网站。在没有代码证明问题的情况下,提及 Azure CDN 并非没有道理。 【参考方案1】:

指向存储中 blob 的 URI 是:

http://accountName.blob.core.windows.net/container/blobName

因此,如果您的存储帐户名为 marvin,容器名为 images,blob 名称为 banner.png,则 URI 为

http://marvin.blob.core.windows.net/images/banner.png

请注意,除非您希望人们能够列出容器中的 blob,否则您应该将公共访问级别设置为 blob,这会使 blob 可见,但会阻止对容器本身的操作。

此外,为了让浏览器正确处理图像,您需要确保已将每个 blob 上的 ContentType 属性设置为正确的 MIME 类型,例如image/png.

【讨论】:

您应该在此 url 中使用帐户名称 BlobEndpoint=http://[myBolbName].blob.core.windows.net/ 而不是 'myBlobName. So your Blob endpoint should be myaccount.blob.core.windows.net`。【参考方案2】:

感谢 Simon W 的评论,当我开始用 try 和 catch 包装代码时,我发现了问题。

我的代码中有以下内容:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse("UseDevelopmentStorage=true");

我之所以使用它,是因为我在某处读到要使 blob 在本地工作,您需要使用“UseDevelopmentStorage=true”。

但这显然在部署到 Azure 时不起作用。所以我必须将其替换为:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse([my-real-storage-connection-string]);

[my-real-storage-connection-string] 在哪里

"DefaultEndpointsProtocol=http;AccountName=[myAccount];AccountKey=[myKey];BlobEndpoint=http://[myBolbName].blob.core.windows.net/"

这行得通。

【讨论】:

以上是关于如何使 Azure 存储 (blob) 工作?的主要内容,如果未能解决你的问题,请参考以下文章

Azure Blob 存储:从 Excel 工作簿中删除密码

源数据集中的动态工作表名称:Azure 数据工厂上的(Excel(Blob 存储))。 - 错误:请为您的数据集选择一个工作表

通过 Azure 媒体服务从 Azure 云存储 Blob 流式传输 mp3(仅限音频)

如何备份 Azure 表和 Blob

如何将 Azure VM 磁盘直接上传到 Blob 存储?

如何从 HTTP 触发的 Azure 函数返回 blob?