Azure CloudBlockBlob的OpenReadAsync和DownloadFromStreamAsync函数之间的差异

Azure CloudBlockBlob的OpenReadAsync和DownloadFromStreamAsync函数之间的差异,azure,azure-storage-blobs,Azure,Azure Storage Blobs,Azure blob存储中的CloudBlockBlob函数的OpenReadAsync和DownloadToStreamAsync之间有什么区别?在google中搜索,但找不到答案。OpenReadAsync返回一个任务,您在等待中使用它 样品试验方法 CloudBlobContainer container = GetRandomContainerReference(); try { await containe

Azure blob存储中的
CloudBlockBlob
函数的
OpenReadAsync
DownloadToStreamAsync
之间有什么区别?在google中搜索,但找不到答案。

OpenReadAsync返回一个
任务
,您在等待中使用它

样品试验方法

CloudBlobContainer container = GetRandomContainerReference();
            try
            {
                await container.CreateAsync();

                CloudBlockBlob blob = container.GetBlockBlobReference("blob1");
                using (MemoryStream wholeBlob = new MemoryStream(buffer))
                {
                    await blob.UploadFromStreamAsync(wholeBlob);
                }

                using (MemoryStream wholeBlob = new MemoryStream(buffer))
                {
                    using (var blobStream = await blob.OpenReadAsync())
                    {
                        await TestHelper.AssertStreamsAreEqualAsync(wholeBlob, blobStream);
                    }
                }
            }
DownloadToStreamAsync是一个虚拟(可以重写)方法,返回任务并将流对象作为输入

示例用法

await blog.DownloadToStreamAsync(memoryStream);

OpenReadAsync和DownloadToStreamAsync都可以为您启动一个异步操作来检索blob流。 根据我的测试,您可以通过以下部分更好地了解它们:

基本概念 DownloadToStreamAsync:启动异步操作,将blob的内容下载到流

OpenReadAsync:启动一个异步操作,将blob的内容下载到流中。

用法 a) 下载到流同步

示例代码:

使用(var fs=new FileStream(,FileMode.Create))
{
等待blob.DownloadToStreamAsync(fs);
}
b) OpenReadAsync

示例代码:

//设置从blob流读取的缓冲区,默认值为4MB。
blob.StreamMinimumReadSizeInBytes=10*1024*1024//10MB
使用(var blobStream=await blob.OpenReadAsync())
{
使用(var fs=new FileStream(localFile,FileMode.Create))
{   
等待blobStream.CopyToAsync(fs);
}
}
通过Fiddler捕获网络请求 a) 下载到流同步

  b) OpenReadAsync


如上所述,DownloadToStreamAsync只发送一个get请求来检索blob流,而OpenReadAsync基于“blob.StreamMinimumReadSizeInBytes”发送多个请求来检索blob流您已设置或默认值。

下载到流同步和
OpenReadAsync
之间的区别在于
下载到流同步
将在返回之前将blob的内容下载到流中,但
OpenReadAsync
在流被消耗之前不会触发下载

例如,如果使用此选项从ASP.NET核心服务返回文件流,则应使用
OpenReadAsync
而不是
DownloadToStreamAsync

下载到StreamAsync的示例(在这种情况下不推荐):

Stream target=new MemoryStream();//可能是文件流
等待blob.DownloadToStreamAsync(目标);//流式传输(下载)完成时返回。这需要在返回之前将整个blob保存在内存中!
_logger.Log(LogLevel.Debug,$“DownloadToStreamAsync:Length:{target.Length}位置:{target.Position}”);//输出:DownloadToStreamAsync:长度:517000位置:517000
target.Position=0;//在返回流之前倒带:
返回文件(目标,contentType:blob.Properties.contentType,fileDownloadName:blob.Name,lastModified:blob.Properties.lastModified,entityTag:null);
带有
OpenReadAsync
的示例(在这种情况下建议):

//不要将流放入using(或关闭它),因为这将在ASP.NET完成使用流之前关闭流。
Stream blobStream=wait blob.OpenReadAsync();//打开流时返回
_logger.Log(LogLevel.Debug,$“OpenReadAsync:Length:{blobStream.Length}位置:{blobStream.Position}”);//输出:OpenReadAsync:长度:517000位置:0
返回文件(blobStream,contentType:blob.Properties.contentType,fileDownloadName:blob.Name,lastModified:blob.Properties.lastModified,entityTag:null);

答案太棒了。这是我发现的唯一一个有文档记录的地方,它可以解释较大文件的问题。较大文件的问题?DownloadToStreamAsync如何处理缓冲区内存?