一、能够解决
在开发一个web项目的时候遇到一个上传文件的问题,起初开发自测都是传的小文件没有报错和问题,上线到测试发现无法上传大型文件甚至100m文件都无法上传。后面发现:
Kestrel 和 HttpSys 都有默认的请求正文大小限制,这是为了防止恶意用户发送大量数据来攻击服务器。这个限制通常在30M左右。
在 Web 项目中,Kestrel 和 HttpSys 都强制实施 30M (~28.6MiB) 的最大请求正文大小限制,
如果请求正文大小超过配置的最大请求正文大小限制,
则引发 Request body too large. The max request body size is xxxxx 异常,
状态码为 413 或 500。
解决办法是设置
在特定接口下的方法添加
[HttpPost]
[RequestSizeLimit(100_000_000)] // 通常设置为 [RequestSizeLimit(long.MaxValue)]
[RequestFormLimits(MultipartBodyLengthLimit = long.MaxValue)]
public IActionResult MyAction([FromBody] MyViewModel data)
{
}
二、
然而,即使你在代码中设置了这些限制,本地运行没有问题,上线到测试环境后还是不能上传大文件,并报request entity too large 413错误;
最后发现Linux服务器上的Nginx或Apache等反向代理服务器也可能有自己的请求正文大小限制。这些限制可能会覆盖你在代码中设置的限制。
为了解决这个问题,你需要在你的反向代理服务器(比如Nginx或Apache)的配置中,设置更大的请求正文大小限制。例如,如果你使用Nginx,你可以在配置文件中添加以下设置:
http {
# 其他配置...
client_max_body_size 3000m;
server {
# 你的服务器配置...
}
server {
# 你的服务器配置...
}
# 其他服务器配置...
}
这样,Nginx就会允许最大100M的请求正文大小。
另外,你也需要确保你的应用程序在Linux服务器上运行时,也使用了你在代码中设置的请求正文大小限制。你可以通过查看应用程序的日志,来确认应用程序是否使用了你在代码中设置的限制。
另外在ASP.NET Core中,你可以在Startup.cs
文件的ConfigureServices
方法中添加services.Configure<FormOptions>(options => options.MultipartBodyLengthLimit = long.MaxValue);
来设置最大请求正文大小限制。这样,你就可以处理大文件上传了。
以下是具体的代码:
public void ConfigureServices(IServiceCollection services)
{
// 其他服务的配置...
// 设置最大请求正文大小限制
services.Configure<FormOptions>(options => options.MultipartBodyLengthLimit = long.MaxValue);
}
这段代码会将MultipartBodyLengthLimit
设置为long.MaxValue
,这意味着请求正文的大小限制将被设置为无限制。
最后重启项目,重启docker服务就解决了以上问题。