Stream 如何仅在Azure blob存在时异步下载它-一步完成?

Stream 如何仅在Azure blob存在时异步下载它-一步完成?,stream,async-await,azure-storage,Stream,Async Await,Azure Storage,我想从Azure存储异步下载块blob,但前提是该blob存在 var blob=documentsContainer.GetBlockBlobReference(blobName); if(等待blob.ExistsAsync()) 等待blob.DownloadToStreamAsync(流); 但这会产生两个HTTP调用,对吗?在我的应用程序中,常见的路径是blob将存在,所以大多数时候我不希望存在检查的开销。但是我需要优雅地处理这个水滴不存在的情况 我试着离开存在检查,只使用try/c

我想从Azure存储异步下载块blob,但前提是该blob存在

var blob=documentsContainer.GetBlockBlobReference(blobName);
if(等待blob.ExistsAsync())
等待blob.DownloadToStreamAsync(流);
但这会产生两个HTTP调用,对吗?在我的应用程序中,常见的路径是blob将存在,所以大多数时候我不希望存在检查的开销。但是我需要优雅地处理这个水滴不存在的情况

我试着离开存在检查,只使用try/catch块。如果我使用的是
DownloadTextAsync
,那么这是可行的,但是当使用
DownloadToStreamAsync
时,如果blob不在那里,它就会挂起

有没有一种方法可以将二进制blob异步下载到流中(仅当它存在时),而不进行两次调用?

结果表明,它确实正确地引发了异常:

试试看
{
var blob=documentsContainer.GetBlockBlobReference(blobName);
等待blob.DownloadToStreamAsync(流);
...
}
捕获(StorageException-ex)
{
if((HttpStatusCode)ex.RequestInformation.HttpStatusCode==HttpStatusCode.NotFound)
{
return null;//退出调用函数
}
投掷;
}

当我最初尝试此功能时,它在
DownloadToStreamAsync
调用时挂起。在原始问题中的注释之后,我开始检查版本,发现Microsoft.Data.Services.Client.dll中存在不匹配。我使用的是5.6.1,但我的测试项目不知怎么的有5.6.0。(我不确定它是从哪里来的,因为它根本不在我的解决方案中)。从测试项目中手动引用Microsoft.Data.Services.Client 5.6.1后,它不再挂起。

DownloadToStreamAsync中缺少异常对我来说似乎是一个bug。DownloadToStreamAsync如果不存在,应该抛出异常。您使用的是哪个版本的Windows Azure存储客户端库?您在哪个环境上开发应用程序?@SerdarOzler Microsoft请参阅下面的答案。谢谢!