项目场景:
项目使用.NetCore 3.1框架,WebAPI post(IFormFile 接收文件) 接口,通过 IIS 发布后,并使用 Nginx 代理。
参数:file(文件)、filePath(上传路径)。
问题描述:
【问题描述】:调用发布的文件上传接口,上传大小为 1.1M
的文件 ,返回 413 Request Entity Too Large
。
原因分析:
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.conf
的 http{ }
中添加配置。
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.cs
的 ConfigureServices()
方法添加以下语句。
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.cs
的 ConfigureServices()
方法添加 配置。
services.Configure<FormOptions>(options => {
options.MultipartBodyLengthLimit = int.MaxValue;
});