首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Azure Blob下载(获取)导致失败的PUT请求

Azure Blob下载(获取)导致失败的PUT请求
EN

Stack Overflow用户
提问于 2017-01-11 15:24:59
回答 2查看 1.1K关注 0票数 2

我正在从Azure blob下载文件以显示给我的用户。这些文件只是doc/docx/pdf格式的简历。这在几天前才开始工作,我所做的唯一的事情就是更新Azure,所以这可能是原因。方法从客户端调用,最后调用如下所示的方法:

代码语言:javascript
运行
复制
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方法的定义如下:

代码语言:javascript
运行
复制
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请求,以及如何解决这种行为,这让我抓狂。同样有趣的是,据我所见,一切都很好,而且我所有的上传和下载调用都在发生。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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来捕获异常(例如,有人创建了同名的资源,等等)。独自一人。

此外,您还可以利用ILSpyReSharper检索有关CloudBlobContainer.CreateIfNotExists的更详细的实现。

票数 5
EN

Stack Overflow用户

发布于 2017-01-12 01:40:54

PUT请求由container.CreateIfNotExists()触发,当容器已经存在时,该请求将按预期失败。整个代码路径工作正常,我认为您不需要担心任何事情。

container.CreateIfNotExists()的机制是already将向服务器发送一个Put容器请求,如果它是409 (冲突),则吞下错误,因为它指示容器已经存在。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41594655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档