使用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
相关产品推荐
相关产品推荐

