如何在.NET 5.0中处理HTTP Error 413.1并在控制器捕获该异常
解决ASP.NET Core中捕获文件上传413.1异常的问题
默认情况下,Kestrel或IIS会在请求到达控制器方法前就拦截超出大小限制的请求,直接返回413.1错误页面。要在控制器的Post方法中捕获该异常,需要先调整配置让请求能到达控制器,再进行异常处理。
1. 调整服务器配置,允许请求到达控制器
Kestrel配置
在Program.cs中设置最大请求体大小,避免Kestrel提前拦截:
builder.WebHost.ConfigureKestrel(options => { options.Limits.MaxRequestBodySize = 52428800; // 设置为50MB,可根据需求调整 });
IIS配置
如果部署在IIS环境,还需修改web.config,添加请求过滤规则:
<system.webServer> <security> <requestFiltering> <!-- 最大允许请求大小,单位字节,此处为50MB --> <requestLimits maxAllowedContentLength="52428800" /> </requestFiltering> </security> </system.webServer>
2. 在控制器方法中捕获异常
配置完成后,请求会到达控制器,此时可以通过try-catch捕获InvalidDataException(ASP.NET Core中请求体过大时抛出的异常):
[HttpPost("UploadFiles")] public async Task<IActionResult> UploadFiles([Bind]Model model) { try { if (model.Files == null || model.Files.Count == 0) { return BadRequest("请选择要上传的文件"); } foreach (var file in model.Files) { // 可选:单独校验单个文件大小 if (file.Length > 10485760) // 单个文件限制10MB { return BadRequest($"文件「{file.FileName}」超出大小限制"); } // 执行文件保存逻辑 var savePath = Path.Combine("uploads", Guid.NewGuid() + Path.GetExtension(file.FileName)); using (var stream = new FileStream(savePath, FileMode.Create)) { await file.CopyToAsync(stream); } } return Ok("文件上传成功"); } catch (InvalidDataException ex) { if (ex.Message.Contains("Request body too large")) { return StatusCode(StatusCodes.Status413PayloadTooLarge, "总文件大小超出限制,请调整后重试"); } return StatusCode(StatusCodes.Status500InternalServerError, $"上传出错:{ex.Message}"); } }
3. 前端友好提示(可选)
通过AJAX请求时,可直接捕获413状态码并提示用户:
document.getElementById('btnSubmit').addEventListener('click', async () => { const formData = new FormData(); const files = document.querySelector('input[name="files"]').files; Array.from(files).forEach(file => formData.append('Files', file)); try { const response = await fetch('/UploadFiles', { method: 'POST', body: formData }); if (!response.ok) { if (response.status === 413) { alert('文件总大小超出限制,请减小文件体积后重试'); } else { const errorText = await response.text(); alert(`上传失败:${errorText}`); } return; } const successText = await response.text(); alert(successText); } catch (err) { alert('网络异常,请稍后再试'); } });
内容的提问来源于stack exchange,提问作者cr7oo
相关产品推荐
相关产品推荐

