使用Azure.Storage.Blobs NuGet包上传文件到Azure Blob Storage失败
根因分析
- 控制台程序没有专属同步上下文,入口Main方法中调用异步任务时使用
.ConfigureAwait(false)会丢弃同步上下文,导致主线程在异步上传任务执行完成前就提前退出,调试进程自动终止,因此既没有捕获到异常也看不到上传结果。 - 现有异常捕获逻辑仅输出异常Message属性,无法获取完整错误栈(如
AggregateException内部异常、Azure服务返回的权限/资源不存在等具体报错)。 UploadAsync方法默认overwrite参数为false,若目标容器已存在同名Blob会抛出异常,不会自动覆盖。- 未校验本地待上传文件路径是否真实存在,路径无效也会触发异常。
修复步骤
- 移除Main方法异步调用末尾的
.ConfigureAwait(false),确保主线程等待上传任务完全执行完成 - 扩展异常捕获逻辑,输出完整异常信息便于定位问题
- 显式指定
UploadAsync的overwrite参数为true(按需开启,允许覆盖同名Blob) - 增加本地文件存在性校验逻辑
- 在程序末尾增加控制台输入等待逻辑,避免调试时窗口自动关闭看不到输出
修复后完整代码
using System; using System.IO; using System.Threading.Tasks; using Azure.Storage.Blobs; namespace BlobUploadDemo { public static class BlobHelper { public static async Task UploadToBlob(string storageAccountConnectionString, string fileToUpload, string containerName) { try { Console.WriteLine("开始执行上传逻辑"); // 校验本地文件是否存在 if (!File.Exists(fileToUpload)) { Console.WriteLine($"错误:本地文件不存在 - {fileToUpload}"); return; } BlobContainerClient blobContainerClient = new BlobContainerClient(storageAccountConnectionString, containerName); // 校验容器是否存在,不存在则创建(可选,按需开启) await blobContainerClient.CreateIfNotExistsAsync(); string fileName = Path.GetFileName(fileToUpload); BlobClient blob = blobContainerClient.GetBlobClient(fileName); // 上传文件,允许覆盖同名Blob await blob.UploadAsync(fileToUpload, overwrite: true); Console.WriteLine("文件上传完成!"); } catch (Exception ex) { // 输出完整异常信息,包含内部异常和调用栈 Console.WriteLine($"上传出错:{ex.ToString()}"); } } } class Program { static async Task Main(string[] args) { string storageAccountConnectionString = "DefaultEndpointsProtocol=https;AccountName=sghackathondemo;AccountKey=kCzwrMVmG8r4E9d1q9LKA0W8OuCtPp3WWbeBWoMfyW/6idSN0wPPU+QBnBVndAv+v9tS63gcnpUY1R1CnsHB8A==;EndpointSuffix=core.windows.net"; string containerName = "files"; string filePath = @"D:\Learning\test.txt"; // 移除ConfigureAwait(false),等待上传任务完成 await BlobHelper.UploadToBlob(storageAccountConnectionString, filePath, containerName); // 调试时防止窗口自动关闭 Console.WriteLine("按任意键退出程序..."); Console.ReadKey(); } } }
额外校验点
如果修复后仍有报错,可按以下顺序排查:
- 确认存储账户的访问密钥是否有效,未被轮换
- 确认存储账户的防火墙设置是否允许当前本地设备IP访问
- 确认
files容器的存在性和访问权限配置
内容的提问来源于stack exchange,提问作者PavanKumar GVVS
相关产品推荐
相关产品推荐

