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

使用Azure.Storage.Blobs NuGet包上传文件到Azure Blob Storage失败

根因分析
  1. 控制台程序没有专属同步上下文,入口Main方法中调用异步任务时使用.ConfigureAwait(false)会丢弃同步上下文,导致主线程在异步上传任务执行完成前就提前退出,调试进程自动终止,因此既没有捕获到异常也看不到上传结果。
  2. 现有异常捕获逻辑仅输出异常Message属性,无法获取完整错误栈(如AggregateException内部异常、Azure服务返回的权限/资源不存在等具体报错)。
  3. UploadAsync方法默认overwrite参数为false,若目标容器已存在同名Blob会抛出异常,不会自动覆盖。
  4. 未校验本地待上传文件路径是否真实存在,路径无效也会触发异常。
修复步骤
  • 移除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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:54:03