当前位置:  开发笔记 > 编程语言 > 正文

Azure Blob下载(GET)导致PUT请求失败

如何解决《AzureBlob下载(GET)导致PUT请求失败》经验,为你挑选了1个好方法。

我正在从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的上传和下载调用中.



1> Bruce Chen..:

正如关于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.但在这一点上,你需要用 CloudBlobContainer.Create()try-catch自己捕捉异常(例如有人创建具有相同名称的资源,等等).

此外,您可以利用ILSpy或ReSharper来检索更详细的实现CloudBlobContainer.CreateIfNotExists.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有