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
相关产品推荐
相关产品推荐

