在上传期间下载Azure Append Blob会导致错误412

时间:2018-09-27 21:13:59

标签: c# azure azure-storage azure-storage-blobs

我有一个上传服务器,每分钟将一个新块附加到一个附加Blob。每个块会附加大约2MB的数据:

await blob.AppendBlockAsync(new MemoryStream(data)).ConfigureAwait(false);

在运行时,我需要能够在任何给定时间下载整个append blob。假设20小时后,我需要下载整个append Blob,而上传服务器仍在继续。 20小时x 60分钟x 2MB = 2,400MB。我这样下载:

await blob.DownloadToStreamAsync(ms).ConfigureAwait(false);

问题是我无法在一分钟之内下载2,400MB。结果,当上传服务器附加另一个块时,DownloadToStreamAsync方法将引发异常:

  

远程服务器返回错误:(412)指定的条件   不符合使用HTTP条件标头的情况。

DownloadToStreamAsync()包含允许指定Microsoft.WindowsAzure.Storage.AccessCondition的重载,但是,似乎没有任何选项可以解决此问题。如果您只能在C#中解决此问题,则我会将您的答案标记为正确(不使用AZCopy等工具)。谢谢!

2 个答案:

答案 0 :(得分:1)

您可以快照附加的blob,并从快照blob中读取。

 snapshotBlob = await appendBlob.CreateSnapshotAsync();
 text = await snapshotBlob.DownloadTextAsync();
 await snapshotBlob.DeleteIfExistsAsync();

答案 1 :(得分:0)

根据错误消息,似乎在尝试下载Blob内容时Blob内容已更改。如果更改了Blob,则Blob的ETag将自动更改。请尝试使用以下代码检查并弄清楚。有关存储条件操作的更多详细信息,请参阅document

CloudAppendBlob appendBlob = container.GetAppendBlobReference("myAppendBlob");
appendBlob.FetchAttributes();
var etag = appendBlob.Properties.ETag;
try
{
    appendBlob.DownloadToStream(ms, AccessCondition.GenerateIfMatchCondition(etag));
}
catch (Exception)
{
    appendBlob.FetchAttributes();
    var updateEtag = appendBlob.Properties.ETag;
    Console.WriteLine($"Original:{etag},Updated:{updateEtag}");
    //To Do list
    //appendBlob.DownloadToStream(ms, AccessCondition.GenerateIfMatchCondition(updateEtag));
}

这里有一个类似的issue,您可以参考它。