首页 > 解决方案 > 从 blobBaseClient.DownloadToAsync 获取 FullContent

问题描述

我正在尝试使用BlockBlobClient DownloadToAsync方法下载 blob。如文档中所述,我提供了必需的参数,但只获得了部分内容。相关代码为:

            string messageJson = string.Empty;
            try
            {
                var blobBaseClient = new BlobBaseClient(_connectionString, _containerName, blobName);
                Stream stream = new MemoryStream();
                CancellationToken cancelToken = new CancellationToken();
                StorageTransferOptions storageTransferOptions = new StorageTransferOptions
                {
                    //bytes * 1000000 = MB
                    InitialTransferSize = blobInitialChunkSize.Value * 1000000,
                    MaximumConcurrency = blobChunkUploadMaxThreadCount.Value,
                    MaximumTransferSize = long.MaxValue
                };

                BlobRequestConditions blobRequestConditions = new BlobRequestConditions();
                Response response = await blobBaseClient.DownloadToAsync(stream, blobRequestConditions, storageTransferOptions, cancelToken);
                if(response.Status == Convert.ToInt32(HttpStatusCode.OK)
                {
                    using (StreamReader streamReader = new StreamReader(stream))
                    {
                        messageJson = streamReader.ReadToEnd();
                    }
                }
                else
                {
                    _logger.LogInformation("response.Headers.ContentType : " + response.Headers.ContentType + DateTime.Now.ToString());
                _logger.LogInformation("response.Headers.ContentLength : " + response.Headers.ContentLength + DateTime.Now.ToString());
                _logger.LogInformation("response.Headers.ETag : " + response.Headers.ETag + DateTime.Now.ToString());
                _logger.LogInformation("response.Headers.RequestId : " + response.Headers.RequestId + DateTime.Now.ToString());
                _logger.LogInformation("response.Status : " + response.Status + DateTime.Now.ToString());
                _logger.LogInformation("response.ReasonPhrase : " + response.ReasonPhrase + DateTime.Now.ToString());
                _logger.LogInformation("stream : " + stream + DateTime.Now.ToString());
        }
        catch (Exception ex)
        {
            _logger.LogInformation(ex.Message + " " + DateTime.Now.ToString());
            _logger.LogInformation(ex.StackTrace + " " + DateTime.Now.ToString());
            _logger.LogInformation(ex.Source + " " + DateTime.Now.ToString());
            _logger.LogInformation(ex.InnerException + " " + DateTime.Now.ToString());
            throw;
        }
        return messageJson;

我得到的结果是 else 块(不是异常)& 日志值:

response.Headers.ContentType : application / octet - stream
response.Headers.ContentLength : 189778220
response.Headers.ETag : 0x8D860678531E07B
response.Status : 206
response.ReasonPhrase : Partial Content
stream: System.IO.MemoryStream
messageJson: 

我想知道如何获取完整数据而不是部分数据?任何指针/帮助将不胜感激。

标签: c#azureazure-blob-storage

解决方案


用方法尝试下面的代码DownloadAsync,它将返回 200。

BlobServiceClient blobServiceClient = new BlobServiceClient(_connectionString);
BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(_containerName);
BlobClient blobClient = containerClient.GetBlobClient(blobName);
if (await blobClient.ExistsAsync())
{
    var response = await blobClient.DownloadAsync();
    using (var streamReader = new StreamReader(response.Value.Content))
    {
        while (!streamReader.EndOfStream)
        {
            var line = await streamReader.ReadLineAsync();
            Console.WriteLine(line);
        }
    }
    Console.WriteLine(response);
}

如果你使用 API 版本 2011-01-18 或更高版本,Azure Blob 存储支持返回 206 响应。正如文档所说:

读取完整 blob 的成功操作返回状态代码 200(OK)。

读取指定范围的成功操作返回状态代码 206(部分内容)。


推荐阅读