AWS Elastic Beanstalk中Dotnet Core API大文件上传CORS问题求助
问题描述
我的应用由以下组件构成:
- Vue.js 前端网站
- .NET Core API
我需要在前端支持用户上传最多10个文件,总大小不超过50MB,文件最终存储到S3。为了让API能接收对应大小的请求,我做了以下配置:
- 在控制器方法上添加特性:
[RequestSizeLimit(55 * 1024 * 1024)] public async Task<IActionResult> SubmitWorkshopNote() {...}
- 在Startup.cs中配置FormOptions:
services.Configure<FormOptions>(options => { options.MultipartBodyLengthLimit = 55 * 1024 * 1024; });
本地测试一切正常,但部署到Elastic Beanstalk后,当文件总大小超过约28-29MB时(比如请求Content-Length约36MB),会出现CORS错误。当总大小不超过27MB时,无CORS问题,一切正常。
已尝试的解决步骤:
- 为EB环境添加环境变量(设置
ASPNETCORE_FORWARDEDHEADERS_ENABLED=true) - 发布前在配置文件中添加
client_max_body_size 55M;
我的EB环境使用默认配置+应用负载均衡器,未使用AWS WAF,现在不知道还能检查或尝试哪些操作。
排查与解决建议
1. 调整应用负载均衡器(ALB)的请求大小限制
ALB默认允许的POST请求最大大小为29MB,超过这个阈值时ALB会直接拒绝请求,而浏览器会将这种无CORS头的错误响应解析为CORS问题,这正好匹配你遇到的阈值。
修改步骤:
- 登录AWS控制台,进入目标负载均衡器页面
- 切换到「监听器」标签,选择对应服务的监听器(如HTTPS 443)
- 点击「查看/编辑规则」,添加一条规则,设置请求大小限制为55MB(或更大的余量值)
2. 验证Nginx配置是否生效
在Amazon Linux 2的EB环境中,Nginx作为反向代理,需确保配置文件路径正确:
- 将包含
client_max_body_size 55M;的配置文件放在项目根目录的.platform/nginx/conf.d/下(例如命名为upload.conf) - 部署后通过EB的SSH连接实例,执行
nginx -T命令,确认当前生效的Nginx配置中已包含该参数
3. 完善ASP.NET Core转发头配置
仅开启环境变量可能不够,需明确配置转发头规则,确保应用正确识别来自ALB的请求:
在Startup.cs的ConfigureServices中添加:
services.AddForwardedHeaders(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; // 替换为你的ALB内网IP options.KnownProxies.Add(IPAddress.Parse("10.0.0.0/8")); });
并在Configure方法中,确保app.UseForwardedHeaders();在app.UseCors();和app.UseAuthentication();之前调用
4. 查看实例日志定位问题
通过EB控制台下载完整日志包,重点检查:
- Nginx错误日志(
/var/log/nginx/error.log):查看是否有请求大小超限的拦截记录 - ASP.NET Core应用日志:确认请求是否到达API层,还是在Nginx/ALB阶段被拦截
内容的提问来源于stack exchange,提问作者Carel
相关产品推荐
相关产品推荐

