我正在从Azure blob下载文件以显示给我的用户。这些文件只是doc/docx/pdf格式的简历。这在几天前才开始工作,我所做的唯一的事情就是更新Azure,所以这可能是原因。方法从客户端调用,最后调用如下所示的方法:
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应用程序Insight中看到失败的依赖调用。不是错误,只是失败的依赖关系。每次下载文件时,都会执行GET请求,但同时也会出于某种原因执行PUT请求,结果失败。在下面的图像中,您可以看到这个错误的Insight日志。每个人看起来都一样。调用方法,下载文件,然后调用PUT请求.

为什么要创建这个PUT请求,以及如何解决这种行为,这让我抓狂。同样有趣的是,据我所见,一切都很好,而且我所有的上传和下载调用都在发生。
发布于 2017-01-12 05:20:30
正如发布说明关于8.0.0版的用于.NET的Microsoft存储库中提到的那样:
CreateIfNotExists方法现在只执行一个REST调用,而不是两个REST调用。
这是我的测试,为了更好地理解这个变化,您可以参考它:
在8.0.0版本之前,CreateIfNotExists将检查目标的存在,然后创建资源,如果不存在,如下所示:

在此版本8.0.0之后,CreateIfNotExists将直接调用create方法,并将此操作包装在try-catch中以捕获异常。

总之,此问题是由于特定版本下的Microsoft存储库对.NET的更改所致。您可以调用CloudBlobContainer.Exist(),然后调用CloudBlobContainer.Create()而不是CloudBlobContainer.CreateIfNotExists。但是此时,您需要用CloudBlobContainer.Create()包装try-catch来捕获异常(例如,有人创建了同名的资源,等等)。独自一人。
此外,您还可以利用ILSpy或ReSharper检索有关CloudBlobContainer.CreateIfNotExists的更详细的实现。
发布于 2017-01-12 01:40:54
PUT请求由container.CreateIfNotExists()触发,当容器已经存在时,该请求将按预期失败。整个代码路径工作正常,我认为您不需要担心任何事情。
container.CreateIfNotExists()的机制是already将向服务器发送一个Put容器请求,如果它是409 (冲突),则吞下错误,因为它指示容器已经存在。
https://stackoverflow.com/questions/41594655
复制相似问题