【发布时间】: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;,应该是& -
@Gusman - 你是对的。我现在可以从浏览器中提取文档。现在我需要在发送电子邮件时转换它们。如果你想写这个作为答案,我会投票并接受它。
标签: c# azure-storage azure-blob-storage