微软AspNetCore.Docs大文件上传Demo上传400MB+文件返回500错误求助
问题根因初步判断
从你提供的调试信息中HttpContext.Request.Form抛出Microsoft.AspNetCore.Server.IIS.BadHttpRequestException的特征来看,请求在进入你写的流式上传逻辑前,就被ASP.NET Core默认的表单大小限制拦截,所以不会进入while循环,直接返回500错误。
排查解决步骤
- 调整FormOptions全局表单限制
ASP.NET Core默认的MultipartBodyLengthLimit(多部分表单内容上限)为128MB,刚好覆盖了你23.6MB的正常场景,414MB超过默认值就会触发拦截。在Startup.cs的ConfigureServices方法中添加以下配置:
services.Configure<FormOptions>(options => { // 配置为2GB上限,和你现有配置保持一致 options.MultipartBodyLengthLimit = 2147483648; // 可选补充配置,避免其他表单相关限制 options.ValueLengthLimit = int.MaxValue; options.MultipartHeadersLengthLimit = int.MaxValue; });
- 为上传接口单独添加上传大小特性
Action级别配置的优先级高于全局配置,直接在UploadPhysical方法上补充请求大小限制特性:
[HttpPost] [DisableFormValueModelBinding] [ValidateAntiForgeryToken] [RequestSizeLimit(2147483648)] // 新增,2GB上限 public async Task<IActionResult> UploadPhysical()
临时测试时可以换成[DisableRequestSizeLimit],确认是大小限制问题后再改回指定值。
- 排查HTTP/2协议限制
调试信息显示你使用的是HTTP/2协议,ASP.NET Core 3.x和IIS对HTTP/2的大请求存在默认帧大小、缓冲区限制,可以先临时切换为HTTP/1.1测试上传,如果能正常上传,再补充Kestrel配置:
.ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(serverOptions => { serverOptions.Limits.MaxRequestBodySize = 2147483648; serverOptions.Limits.Http2.MaxFrameSize = 16777215; // HTTP/2最大帧大小上限16MB serverOptions.Limits.Http2.MaxRequestBufferSize = 2147483648; }); webBuilder.UseStartup<Startup>(); });
- 确认存储目录权限和磁盘空间
你配置的存储路径为c:\\files,确认站点运行的IIS应用池身份对该目录有读写权限,同时C盘剩余空间大于上传的文件大小,避免磁盘写入不足提前触发报错。 - 开启详细日志定位具体异常
如果以上操作都无法解决,在appsettings.Development.json中将Microsoft.AspNetCore的日志级别调整为Debug,同时在web.config中开启stdout日志输出,复现问题后查看日志中的异常栈,即可定位具体报错点。
内容的提问来源于stack exchange,提问作者dot
相关产品推荐
相关产品推荐

