簡體   English   中英

Azure Blob下載(GET)導致PUT請求失敗

[英]Azure Blob download(GET) causes failed PUT request

我正在從Azure blob下載文件以將其顯示給我的用戶。 這些文件只是以doc / docx / pdf格式恢復。 這曾經在幾天前工作,我所做的只是更新Azure SDK,所以這可能就是原因。 從客戶端調用方法,最終調用這樣的方法:

CloudBlobContainer container = GetContainer(containerName);
CloudBlockBlob blockBlob = container.GetBlockBlobReference(fileName);
blockBlob.Properties.ContentType = contentType;

using (var fileStream = new MemoryStream())
{
    await blockBlob.DownloadToStreamAsync(fileStream);
    return fileStream;
}

GetContainer方法定義如下:

try
{
    var storageAccount = StorageAccount;
    var blobClient = storageAccount.CreateCloudBlobClient();
    var container = blobClient.GetContainerReference(containerName);

    if (container.CreateIfNotExists())
    {
        container.SetPermissions(new BlobContainerPermissions
        {
             PublicAccess = BlobContainerPublicAccessType.Blob
        });
    }
    return container;
}
catch (Exception e)
{
    Logger.Error("GetBlobContainer fail", e);
}

截至昨天,我一直在Azure Application Insights中看到失敗的依賴性調用。 不是錯誤,只是失敗的依賴。 每次下載文件時,都會執行GET請求,但同時由於某種原因也會執行PUT請求,並且失敗。 在下圖中,您可以看到此錯誤的數據洞察日志。 每個看起來都一樣。 調用該方法,下載文件,然后調用該PUT請求......

在此輸入圖像描述

為什么要創建此PUT請求,以及如何解決此問題,這讓我發瘋。 有趣的是,就我所見,一切正常,所有這些都發生在我所有上傳和下載blob的調用中。

正如關於Microsoft Azure存儲庫for .NET for 8.0.0的發行說明中所述:

CreateIfNotExists方法現在只執行一次REST調用而不是兩次。

這是我的測試,你可以參考它來更好地理解這個變化:

在8.0.0版之前, CreateIfNotExists將檢查目標是否存在,然后創建資源(如果不存在),如下所示:

在此版本8.0.0之后, CreateIfNotExists將直接調用create方法並使用try-catch包裝此操作以捕獲異常。

總之,此問題歸因於特定版本下Microsoft Azure存儲庫for .NET的更改。 您可以調用CloudBlobContainer.Exist() ,然后調用CloudBlobContainer.Create()而不是CloudBlobContainer.CreateIfNotExists 但此時,您需要使用try-catch包裝CloudBlobContainer.Create()以捕獲異常(例如某人已創建具有相同名稱的資源等)。

此外,您可以利用ILSpyReSharper來檢索有關CloudBlobContainer.CreateIfNotExists更詳細的實現。

PUT請求由container.CreateIfNotExists()觸發,當容器已存在時,它應按預期失敗。 整個代碼路徑正常工作,我認為你不必擔心任何事情。

container.CreateIfNotExists()的機制是Azure存儲客戶端庫將向服務器發送放置容器請求,如果它是409(沖突)則吞下錯誤,因為它表明容器已存在。

暫無
暫無

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

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