Azure存储异常:HTTP条件标头不满足,CopyToAsync多文件报错
问题
调用CopyToAsync方法时触发Microsoft.WindowsAzure.Storage.StorageException异常,报错信息:
The condition specified using HTTP conditional header(s) is not met
仅当fileList包含1个文件时代码正常运行,文件数量超过1个时必现报错,怀疑与并发有关,求解决方案。
相关代码
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(_configuration["AzureBlobStorage"]); CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient(); CloudBlobContainer cloudBlobContainer = cloudBlobClient.GetContainerReference("interestgroupattachment"); var blockBlob = cloudBlobContainer.GetBlockBlobReference(filename); using (var stream = await blockBlob.OpenWriteAsync()) using (var zip = new ZipArchive(stream, ZipArchiveMode.Create)) { var files = fileNames; foreach (var docfile in fileList) { using (var fstream = docfile) { var entry = zip.CreateEntry(fileNames[counter], CompressionLevel.Optimal); using (var innerFile = entry.Open()) { await fstream.CopyToAsync(innerFile); } } counter++; } }
解决方案
1. 禁用条件请求检查
OpenWriteAsync默认会添加HTTP条件头(如检查Blob是否存在),多文件写入时易触发冲突。通过传入空条件对象禁用该检查:
// 替换原OpenWriteAsync调用 var stream = await blockBlob.OpenWriteAsync( accessCondition: AccessCondition.GenerateEmptyCondition(), options: new BlobRequestOptions(), operationContext: new OperationContext() );
2. 本地生成Zip后再上传
绕过Blob流的并发写入问题,先在本地内存生成完整Zip文件,再一次性上传:
using (var memoryStream = new MemoryStream()) { using (var zip = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) { int counter = 0; foreach (var docfile in fileList) { using (var fstream = docfile) { var entry = zip.CreateEntry(fileNames[counter], CompressionLevel.Optimal); using (var innerFile = entry.Open()) { await fstream.CopyToAsync(innerFile); } } counter++; } } memoryStream.Position = 0; await blockBlob.UploadFromStreamAsync(memoryStream); }
3. 明确设置Blob覆盖策略
若目标Blob已存在,默认行为可能触发条件冲突,可在请求选项中明确允许覆盖:
var requestOptions = new BlobRequestOptions { AccessCondition = AccessCondition.GenerateEmptyCondition(), Overwrite = true }; using (var stream = await blockBlob.OpenWriteAsync(null, requestOptions, null)) // 后续Zip打包逻辑保持不变
内容的提问来源于stack exchange,提问作者bab951
相关产品推荐
相关产品推荐

