You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 19:10:01