.NET Core WebAPI部署Azure App Service后大文件上传Blob存储失败
解决Azure App Service中.NET Core WebAPI大文件上传Blob存储失败的问题
问题根源
本地运行正常但部署到Azure后提示文件过大,主要是三个层面的问题:
- .NET Core WebAPI的请求大小限制未全局覆盖
- Azure App Service平台默认的请求大小限制(仅30MB)
- 代码本身的流操作错误及资源管理问题
解决方案步骤
1. 全局配置WebAPI请求大小限制
仅在接口上加属性可能存在局部失效的情况,需要在全局配置中同步设置:
// .NET 6+ 在Program.cs中添加 builder.Services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 6104857600; // 6GB options.ValueLengthLimit = 6104857600; }); // .NET 5及更早版本 在Startup.cs的ConfigureServices中添加
2. 修改Azure App Service平台限制
Azure App Service默认限制请求大小为30MB,必须手动调整:
- 登录Azure门户,进入你的App Service资源
- 找到配置 -> 常规设置
- 找到最大请求大小,设置为你需要的值(比如6000,单位为MB)
- 保存配置后重启App Service
3. 修正代码中的错误并优化
你的代码存在流位置错误、不必要的本地文件写入、资源未正确释放等问题,修正后的代码如下:
[RequestFormLimits(MultipartBodyLengthLimit = 6104857600)] [RequestSizeLimit(6104857600)] public async Task<IActionResult> Upload(IFormFile filePosted) { if (filePosted == null || filePosted.Length == 0) { return BadRequest("未上传有效文件"); } // 直接使用IFormFile的流上传,无需中转本地文件或MemoryStream var blobServiceClient = new BlobServiceClient("你的Blob存储连接字符串"); var containerClient = blobServiceClient.GetBlobContainerClient("你的容器名称"); await containerClient.CreateIfNotExistsAsync(); // 确保容器存在 var blobClient = containerClient.GetBlobClient(filePosted.FileName); var uploadOptions = new BlobUploadOptions { TransferOptions = new StorageTransferOptions { MaximumConcurrency = 8, MaximumTransferSize = 220 * 1024 * 1024 // 220MB分片上传 } }; // 重置流位置到开头,避免上传空内容 using var fileStream = filePosted.OpenReadStream(); fileStream.Position = 0; await blobClient.UploadAsync(fileStream, uploadOptions); return Ok(new { 上传状态 = "成功", Blob地址 = blobClient.Uri.ToString() }); }
4. 额外优化建议
- 对于1GB以上的超大文件,推荐生成Blob SAS URL让客户端直接上传,绕过WebAPI的带宽和限制,减轻服务器压力
- 添加上传日志,方便排查Azure环境中的异常
- 启用Azure App Service的诊断日志,查看请求失败的具体原因
内容的提问来源于stack exchange,提问作者Rohan
相关产品推荐
相关产品推荐

