[英]Unable to retrieve file from Azure Blob Storage using SAS
我們有一個基於網絡的應用程序,允許用戶發送電子郵件。 每個電子郵件正文都包含一個表示簽名塊的圖像。 圖像存儲在私有容器中的 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 實體,而不是&
您正在接收&
. 鏈中處理消息直到它到達您的客戶端(您的 api、郵件服務器、Web 瀏覽器、郵件客戶端......我對此表示懷疑,我也使用 Azure blob 存儲,但從未收到過編碼)。
如果您手動解碼那些轉義的字符,您會注意到 Uri 工作正常,因此現在您必須找到鏈中被編碼的位置,這是一個完全不同的場景。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.