[英]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()
以捕獲異常(例如某人已創建具有相同名稱的資源等)。
此外,您可以利用ILSpy或ReSharper來檢索有關CloudBlobContainer.CreateIfNotExists
更詳細的實現。
PUT請求由container.CreateIfNotExists()觸發,當容器已存在時,它應按預期失敗。 整個代碼路徑正常工作,我認為你不必擔心任何事情。
container.CreateIfNotExists()的機制是Azure存儲客戶端庫將向服務器發送放置容器請求,如果它是409(沖突)則吞下錯誤,因為它表明容器已存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.