[英]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.