【问题标题】:Unable to retrieve file from Azure Blob Storage using SAS无法使用 SAS 从 Azure Blob 存储中检索文件
【发布时间】:2021-01-31 18:25:00
【问题描述】:

我们有一个基于网络的应用程序,允许用户发送电子邮件。每个电子邮件正文都包含一个代表签名块的图像。映像存储在私有容器中的 Azure Blob 存储中。为了从存储中提取图像并将其放入电子邮件正文中,因为电子邮件是由用户构建的,我们使用以下 C# 函数生成一个 Uri:

public string GenerateBlobDownloadUri(string containerName, string blobName)
        {
            var policy = new SharedAccessBlobPolicy();

            // Get a reference to a container if it exists.
            var container = GetContainer(containerName, false);
            if (container == null)
                return string.Empty;

            // Retrieve reference to the blob
            CloudBlockBlob blockBlob = container.GetBlockBlobReference(blobName);
            if (!blockBlob.Exists())
                return string.Empty;

            policy.SharedAccessExpiryTime = DateTime.Now.AddYears(10);
            policy.Permissions = SharedAccessBlobPermissions.Read;

            var token = blockBlob.GetSharedAccessSignature(policy);

            return blockBlob.Uri + token;
        }

使用此功能,我们能够在构建电子邮件时成功地将图像从 Azure 拉入我们的电子邮件正文并使其正确显示。

但是,如果我查看电子邮件的底层 HTML 代码,复制生成的 Uri 并将其粘贴到浏览器中,图像将不会显示或下载。我刚收到一条 Json 消息,说找不到图片。

上述函数生成的实际Uri是这样的:

https://xxxxx.blob.core.windows.net/winterscontainer/55-Email Signature Block.png?sv=2018-03-28&sr=b&sig=8zkwcK7naE%2BPZRfo6GtBYVfHJLzlCBLR6IaYymTIOGo%3D&se=2030-10-17T12%3A30%3A56Z&sp=r

同样,此 Uri 在我们的应用程序中工作,并在创建电子邮件时正确提取图像并正确显示。但是,在发送电子邮件时,收件人只会看到图像的占位符。

如果我将 Uri 粘贴到浏览器中,我会得到:

<Error>
<Code>ResourceNotFound</Code>
<Message>The specified resource does not exist. RequestId:4ca4e68b-b01e-0130-5781-a4a67e000000 Time:2020-10-17T12:33:33.0601864Z</Message>
</Error>

【问题讨论】:

  • 我没有得到最后一部分this Uri works from within our application,然后是However, when the email is sent, the recipient just sees a placeholder for the image.。这两个步骤的URI有什么区别
  • @YegorAndrosov - 这就是问题所在,Uri 没有区别。
  • 您是否使用 Azure 存储资源管理器检查了容器?我看到的唯一选项是删除文件
  • Uri的查询部分已经用HTML编码了,看那些&amp;amp;,应该是&amp;
  • @Gusman - 你是对的。我现在可以从浏览器中提取文档。现在我需要在发送电子邮件时转换它们。如果你想写这个作为答案,我会投票并接受它。

标签: c# azure-storage azure-blob-storage


【解决方案1】:

如果您检查您的 Uri,您会发现查询部分有些“奇怪”,与号被转换为 HTML 实体,而不是 &amp;amp;,您收到的是 &amp;amp;。 处理消息直到它到达您的客户端(您的 api、邮件服务器、Web 浏览器、邮件客户端......我对此表示怀疑,我也使用 Azure blob 存储,但从未收到它的编码)。

如果您手动解码这些转义字符,您会注意到 Uri 工作正常,所以现在您必须找到编码链中的哪个位置,这是完全不同的情况。

【讨论】:

    猜你喜欢
    • 2020-10-05
    • 2021-12-23
    • 1970-01-01
    • 2020-09-19
    • 2016-08-13
    • 1970-01-01
    • 2021-04-29
    • 2019-09-05
    • 2015-06-20
    相关资源
    最近更新 更多