项目中通过webapi上传pdf文件到服务器中,当需要上传50M左右的文件时,出现了413错误
一、413错误解决方案
1.修改Nginx配置
配置文件nginx.conf的http{}中增加client_max_body_size设置,如果不设置的话,client_max_body_size默认大小为1m
http{
client_max_body_size 200M;
}
2.修改web.config文件
项目为微服务模式,文件上传涉及了web和文档模块,则两边都需要调整web.config,通过设置maxAllowedContentLength来限制IIS模式启动是上传文件的最大大小。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="false">
<system.webServer>
<handlers>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
</handlers>
<aspNetCore requestTimeout="00:20:00" processPath="dotnet" arguments=".\MvcWeb.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="52428800" />
</requestFiltering>
</security>
</system.webServer>
</location>
</configuration>
3.修改Startup.cs
限制内核模式启动时上传文件的最大大小
services.Configure<FormOptions>(options =>
{
options.MultipartBodyLengthLimit = 52428800;//50M
});
4.修改Controller方法
在对应的控制器方法上增加[DisableRequestSizeLimit]属性,
[HttpPost]
[DisableRequestSizeLimit]
public int UploadFile([FromForm]FileModel entity, IFormFile file)
{
renturn 0;
}
二、Request body too large解决方案
经过上述的调整后,本地启动项目测试上传50M文件能够成功,发布测试环境之后,文件上传失败,出现了Request body too large错误。通过查询官方文档发现MaxRequestBodySize默认大小是30000000字节,约28.6M,通过如图的测试,确认是MaxRequestBodySize设置问题导致的文件上传失败。
在本地启动时,是通过IIS,而测试环境是部署在Linux系统下,通过nginx转发kestrel实现,所以需要在Startup.cs中加以下代码:
services.Configure<KestrelServerOptions>(options =>
{
options.Limits.MaxRequestBodySize = 52428800; //MaxRequestBodySize默认是28.61MB(30,000,000 bytes)
});
重新部署之后,测试50M文件能够成功上传。
关于.Net Core中上传文件大小限制(微服务) https://blog.csdn.net/Cool_ketchup/article/details/118489652