微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无法使用SAS从Azure Blob存储中检索文件

如何解决无法使用SAS从Azure Blob存储中检索文件

我们有一个基于Web的应用程序,允许用户发送电子邮件。每个电子邮件正文都包含代表签名块的图像。图像存储在私有容器中的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>

解决方法

如果检查您的Uri,您会在查询部分发现一些“奇怪”的东西,“&”符号将被转换为HTML实体,而不是long big = (long) 1e300;,您将收到&。 直到消息到达您的客户端(您的api,邮件服务器,Web浏览器,邮件客户端...都有很多可能)之前,消息链中的某些内容都对其进行了编码(可能是您已经收到了编码,但我对此表示怀疑,我也使用Azure blob存储,但从未收到过对其进行编码的信息。

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。