c# - 从 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:
我想知道如何获取完整数据而不是部分数据?任何指针/帮助将不胜感激。
解决方案
用方法尝试下面的代码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(部分内容)。
推荐阅读
- aurelia - 检测子组件何时重新渲染
- java - 使用 javapackager 时如何合并未命名的模块
- javascript - React TypeError:无法读取未定义的属性“searchField”
- python-3.x - 使用 if 创建新列,否则来自列表的语句
- websphere - 将参数动态传递给 wsadmin.sh 中使用的 jython
- python-3.x - 如何用 strptime 解析特定的日期格式?
- java - java.lang.ClassNotFoundException: com.vuforia.VuforiaUnityPlayer.VuforiaInitializer
- ms-access - 在查询中使用多选列表框
- r - R:抑制基本图形绘图但将绘图作为对象返回
- uwp - 项目创建后如何更改应用程序名称?