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

微软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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 06:06:04