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

使用RequestSizeLimitAttribute时大文件上传触发HttpRequestException问题

问题原因及解决方案

核心原因

你遇到的问题是Kestrel服务器的请求体大小限制优先级高于ASP.NET Core MVC的RequestSizeLimitAttribute:

  • 上传250KB文件时,虽然超过了RequestSizeLimit设置的100KB,但仍在Kestrel默认的请求体大小限制范围内,请求能正常到达控制器逻辑,触发异常后返回预期的413响应。
  • 上传15MB文件时,文件大小超过了Kestrel的默认请求体大小限制,Kestrel会直接关闭TCP连接,不会将请求传递到MVC控制器,因此客户端收到“远程主机强制关闭连接”的异常,而非413响应。

解决方案

1. 调整Kestrel的请求体大小限制

在Program.cs中配置Kestrel,将MaxRequestBodySize设置为大于你RequestSizeLimit的值(或设为null完全交由RequestSizeLimitAttribute控制):

builder.WebHost.ConfigureKestrel(options =>
{
    // 示例:设置为20MB,确保大于你的RequestSizeLimit(100KB)
    options.Limits.MaxRequestBodySize = 20 * 1024 * 1024;
    // 若想完全由RequestSizeLimit控制,可设为null
    // options.Limits.MaxRequestBodySize = null;
});

2. 配置Multipart请求长度限制

针对Multipart表单上传,需在MVC配置中同步设置MultipartBodyLengthLimit,避免解析Multipart数据时提前触发错误:

builder.Services.AddControllers(options =>
{
    // 和RequestSizeAttribute设置的100_000保持一致
    options.MultipartBodyLengthLimit = 100_000;
});

3. 可选:全局禁用默认请求大小限制

如果希望全局取消默认请求体大小限制,仅通过RequestSizeLimitAttribute控制单接口的大小,可在中间件管道中添加:

app.UseHttpsRedirection();
app.UseAuthorization();

// 全局禁用默认请求大小限制
app.Use(async (context, next) =>
{
    var limitFeature = context.Features.Get<IHttpMaxRequestBodySizeFeature>();
    if (limitFeature != null)
    {
        limitFeature.MaxRequestBodySize = null;
    }
    await next.Invoke();
});

app.MapControllers();

验证效果

调整配置后,重新上传15MB文件,请求会正常到达控制器Action,触发BadHttpRequestException并返回413状态码,客户端将不再出现连接断开的异常。

内容的提问来源于stack exchange,提问作者Paolo Crociati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 12:32:03