我有一个上传服务器,每分钟将一个新块附加到一个附加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等工具)。谢谢!
答案 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,您可以参考它。