簡體   English   中英

無法使用 SAS 從 Azure Blob 存儲檢索文件

[英]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 實體,而不是&您正在接收&amp; . 鏈中處理消息直到它到達您的客戶端(您的 api、郵件服務器、Web 瀏覽器、郵件客戶端......我對此表示懷疑,我也使用 Azure blob 存儲,但從未收到過編碼)。

如果您手動解碼那些轉義的字符,您會注意到 Uri 工作正常,因此現在您必須找到鏈中被編碼的位置,這是一個完全不同的場景。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM