BUG记录 -- 413 Request Entity Too Largenet(.NetCore3.1)

项目场景:

项目使用.NetCore 3.1框架,WebAPI post(IFormFile 接收文件) 接口,通过 IIS 发布后,并使用 Nginx 代理。

参数:file(文件)、filePath(上传路径)。


问题描述:

【问题描述】:调用发布的文件上传接口,上传大小为 1.1M 的文件 ,返回 413 Request Entity Too Large

413

原因分析:

1. 使用 VS 调试项目接口

  • 文件大小为 38.5M 可以上传成功;
  • 38.6M 上传失败! 报错 :Microsoft.AspNetCore.Server.==Kestrel==.Core.BadHttpRequestException: Request body too large ,解决方案在 “扩展解决方案1”。

2. 使用 IIS 发布调试接口

  • 文件大小为 38.5M 可以上传成功;
  • 38.6M 上传失败! 报错 :Microsoft.AspNetCore.Server.==IIS==.BadHttpRequestException: Request body too large ,解决方案在 “扩展解决方案2”。

【分析】:
通过上方调试可见,问题不在 VS 接口IIS发布上。BUG原因:Nginx中 上传文件 默认长度限制为 1M

【扩展】 :WebAPI 上传文件属性默认长度:

属性描述
maxAllowedContentLength可选的uint属性。
指定请求中内容的最大长度(以字节为单位)。
默认值是30000000,大约是28.6MB。
maxQueryString可选的uint属性。
指定查询字符串的最大长度(以字节为单位)。
默认值是2048。
maxUrl可选的uint属性。
指定URL的最大长度(以字节为单位)。
默认值是4096。

解决方案:

Nginx 长度限制 1M 解决方案

【解决方案】:在 Nginx 服务的配置文件 Nginx.confhttp{ }中添加配置。

client_max_body_size 100m;

在这里插入图片描述




扩充解决方案:

1. 解决 Kestrel – Request body too large 方案:

【解决方案】:在 Program.cs 文件上修改为以下语句。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>()
            // 为Kestrel 请求过长配置
            .UseKestrel(options =>
            {
            	//长度最好不要这样设置
                options.Limits.MaxRequestBodySize = null;
            });
        });

【测试】:

  • 测试1:97.3M 的文件上传成功;
  • 测试2:127M 文件上传成功;
  • 测试3:128M 的文件上传失败,接口返回状态码 400,报错内容:Failed to read the request form. Multipart body length limit 134217728 exceeded.。根据报错内容,可以看出长度限制为 134217728 = 128M;

【提示】:在 Program.cs 上 配置 UseKestrel,使用 IIS 调试报错System.InvalidOperationException:“Application is running inside IIS process",则使用调试项目即可。


2. 解决 IIS – Request body too large 方案:

【解决方案】:
   a. 在 配置文件 Startup.csConfigureServices() 方法添加以下语句。

services.Configure<IISServerOptions>(options => {
    options.MaxRequestBodySize = int.MaxValue;
});

  b. 在 配置文件 Web.config 中添加以下语句。

<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <!--上传文件的大小限制-->
        <requestLimits maxAllowedContentLength="400000000" />
      </requestFiltering>
    </security>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="InProcess" />
  </system.webServer>
</configuration>

  c. 在IIS上修改配置
在这里插入图片描述

【提示】: 这是一项安全功能。请不要更改此功能,除非您完全清楚更改的影响范围。您可以配置 IIS 服务器以拒绝内容长度大于指定值的请求。如果请求的内容长度大于所配置的长度,便会返回此错误。如果需要增加内容长度,请修改 configuration/system.webServer/security/requestFiltering/requestLimits@maxAllowedContentLength 设置。

3. 扩充:不知道修改的作用是什么,暂记录。

【解决方案】:在Startup.csConfigureServices()方法添加 配置。

services.Configure<FormOptions>(options => {
    options.MultipartBodyLengthLimit = int.MaxValue;
});
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IIS 10.0 - 413.1 - Request Entity Too Large错误是指在使用IIS 10.0作为Web服务器时,当请求的实体(通常是请求的主体部分)超过服务器所允许的大小限制时,会出现该错误。这个错误通常发生在上传文件或提交大量数据的情况下。 解决这个问题的方法有以下几种: 1. 修改IIS配置文件:可以通过修改IIS的配置文件来增加请求实体的大小限制。打开IIS管理器,找到对应的网站或应用程序池,右键点击属性,选择"配置编辑器"。在"系统.webServer"节点下找到"security/requestFiltering/requestLimits"节点,将"maxAllowedContentLength"属性的值增加到所需的大小。保存更改后,重新启动IIS服务。 2. 修改Web.config文件:可以在网站的根目录下的Web.config文件中添加或修改以下配置来增加请求实体的大小限制: ```xml <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="xxx" /> </requestFiltering> </security> </system.webServer> ``` 其中,"xxx"表示所需的大小限制,以字节为单位。保存更改后,重新启动IIS服务。 3. 使用上传组件:如果您的应用程序需要处理大文件上传,可以考虑使用第三方的上传组件,如ASP.NET的FileUpload控件或者其他开源的上传组件。这些组件通常提供了更灵活的配置选项,可以轻松处理大文件上传。 4. 调整客户端请求:如果您无法修改服务器的配置或使用上传组件,您还可以尝试调整客户端请求的大小。例如,可以通过减小上传文件的大小或者分块上传的方式来避免超过服务器的限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值