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

如何在.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 10:55:21