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

Azure Blob分块上传:StageBlockAsync异常检测与重试方案咨询

检测Azure Blob分块上传中StageBlockAsync的异常

要检测StageBlockAsync执行时的异常,直接用try-catch块包裹该方法调用即可。Azure Blob存储SDK在操作失败时会抛出RequestFailedException(位于Azure.Requests命名空间),这个异常包含具体的错误状态码、错误信息等细节,方便判断失败原因。

修改后的代码示例

public async Task<string> UploadFiles(string connectionString, File file, string blobContainer)
{
    BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
    BlobContainerClient containerClient = blobServiceClient.GetBlobContainerClient(blobContainer);
    BlockBlobClient blockBlobClient = containerClient.GetBlockBlobClient(file.Name);

    using (Stream stream = file.InputStream)
    {
        byte[] buffer = new byte[1024 * 50];
        int bytesRead;
        int blockNumber = 0;

        while ((bytesRead = await stream.ReadAsync(buffer, 0, buffer.Length)) > 0)
        {
            using (MemoryStream chunkStream = new MemoryStream(buffer, 0, bytesRead))
            {
                string blockId = Convert.ToBase64String(BitConverter.GetBytes(blockNumber));
                try
                {
                    // 执行分块上传并捕获异常
                    await blockBlobClient.StageBlockAsync(blockId, chunkStream);
                    blockNumber++;
                }
                catch (RequestFailedException ex)
                {
                    // 处理异常:记录错误日志、标记块上传失败等
                    // ex.Status包含HTTP状态码,ex.Message包含错误详情
                    Console.WriteLine($"块 {blockNumber} 上传失败: {ex.Message},状态码: {ex.Status}");
                    // 若需重试,重置流位置后重新上传
                    chunkStream.Position = 0;
                    await blockBlobClient.StageBlockAsync(blockId, chunkStream);
                    blockNumber++;
                }
            }
        }

        var blockList = Enumerable.Range(0, blockNumber)
            .Select(x => Convert.ToBase64String(BitConverter.GetBytes(x)))
            .ToList();
        await blockBlobClient.CommitBlockListAsync(blockList);
    }
    return blockBlobClient.Uri.ToString();
}

关键说明

  • 异常类型:优先捕获RequestFailedException,这是Azure SDK抛出的标准异常,能精准获取存储服务返回的错误信息。
  • 流重置:如果需要重试,必须将chunkStream的Position重置为0,否则之前的流指针移动会导致重试时上传空数据。
  • 错误处理:可根据ex.Status判断错误类型,比如400(请求格式错误)、403(权限不足)、500(服务端异常)等,做针对性处理。

内容的提问来源于stack exchange,提问作者Andrew C

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 20:05:09