如何通过Azure Front Door使用C#上传文件到Azure Blob Storage
通过Azure Front Door向Blob Storage上传文件的C#实现方案
为什么直接修改连接字符串不生效
Azure.Storage.Blobs SDK的连接字符串解析逻辑默认绑定存储账户的原生端点规则,会校验EndpointSuffix的合法性,直接将core.windows.net替换为azurefd.net不符合SDK的内部解析逻辑,因此无法生效。
前置配置(必须先完成)
- 你的Azure Front Door实例已经配置指向目标Blob存储账户的源组,源类型选择
存储 blob,回源协议设置为HTTPS - 编辑AFD对应的路由规则,放行PUT、POST、PATCH等上传所需的HTTP方法,AFD默认路由规则仅放行GET、HEAD请求,未放行的方法会直接被拦截
- 确认通过AFD端点已经可以正常下载Blob文件,保证基础的路由和回源配置正常
C#代码实现
方案1:SAS令牌认证(推荐,跨场景兼容性最好)
using Azure.Storage.Blobs; // 替换为你的AFD端点,结尾不要加斜杠 var afdEndpoint = new Uri("https://你的AFD实例名.azurefd.net"); // 替换为你生成的具有对应容器写入权限的SAS令牌,开头带? var sasToken = "?sv=2022-11-02&ss=b&srt=sco&sp=rwdlac&se=2024-12-31T23:59:59Z&st=2024-01-01T00:00:00Z&spr=https&sig=xxxxxx"; // 直接构造带SAS的AFD端点创建Blob客户端 var blobServiceClient = new BlobServiceClient(new Uri($"{afdEndpoint}{sasToken}")); // 后续上传逻辑和原生Blob SDK用法完全一致 var containerClient = blobServiceClient.GetBlobContainerClient("目标容器名"); var blobClient = containerClient.GetBlobClient("目标Blob名称"); // 上传本地文件 await blobClient.UploadAsync("本地文件路径", overwrite: true);
方案2:存储账户密钥认证(兼容原有连接字符串逻辑)
不需要修改原有存储账户连接字符串,自定义客户端端点即可:
using Azure.Storage; using Azure.Storage.Blobs; // 原有存储账户连接字符串,无需修改 var originalConnStr = "DefaultEndpointsProtocol=https;AccountName=你的存储账户名;AccountKey=你的存储账户密钥;EndpointSuffix=core.windows.net"; // 替换为你的AFD端点 var afdEndpoint = new Uri("https://你的AFD实例名.azurefd.net"); // 从原连接字符串解析认证信息 var sharedKeyCredential = StorageSharedKeyCredential.FromConnectionString(originalConnStr, out _); // 用AFD端点+原有认证信息创建客户端 var blobServiceClient = new BlobServiceClient(afdEndpoint, sharedKeyCredential); // 后续上传逻辑和原生用法完全一致 var containerClient = blobServiceClient.GetBlobContainerClient("目标容器名"); await containerClient.GetBlobClient("目标Blob名称").UploadAsync("本地文件路径", overwrite: true);
注意事项
- AFD仅做流量转发,不会修改请求里的认证信息,存储账户的私有访问、防火墙规则等配置无需额外调整,只要保证AFD的回源请求可以正常访问存储账户即可
- 大文件分片上传、断点续传等场景完全兼容,不需要修改原有业务逻辑
- 如果你使用的是旧版
Microsoft.Azure.Storage.BlobSDK,逻辑完全一致,仅需要自定义Blob服务的端点即可
内容的提问来源于stack exchange,提问作者Yuriy Gavrishov
相关产品推荐
相关产品推荐

