https://www.talkingdotnet.com/how-to-increase-file-upload-size-asp-net-core/
(2018年6月19日) Talking DotNet ASP.NET核
ASP.NETCore2.0强制执行30 MB(~28.6 MIB)最大请求体尺寸限制,是吗?红隼和HttpSys。在正常情况下,不需要增加HTTP请求的大小。但是,当您试图上传大型文件(>30 MB)时,需要增加默认允许的限制。在这篇短文中,我们将看到如何在ASP.NETCore应用程序中增加文件上传大小,以及控制这种限制的各种选项。
增加ASP.NET内核中的文件上载大小
如果您也在ASP.NETCore中寻找文件上传解决方案,以下是一些有用的帖子。
众所周知,ASP.NETCore应用程序与平台无关,因此您可以在Windows、Linux或Mac平台上托管它们。换句话说,您可以在IIS、Ngnix和ApacheWeb服务器上承载应用程序。Kestrel是ASP.NETCore的跨平台Web服务器,默认情况下包含在ASP.NETCore项目模板中。Kestrel可以用作独立服务器,也可以用于反向代理服务器,例如IIS、Nginx或Apache。
没有单一的解决方案涵盖所有增加请求大小限制的部署选项。解决方案根据部署选项的不同而不同。我们可能有以下部署方案,
- 托管在IIS上(带有Kestrel或不带Kestrel)
- 托管在Kestrel(作为独立的或与Ngnix和Apache服务器)
托管在IIS上
请记住,在ASP.NET中,我们曾经设置maxRequestLength
在web.config文件中,以增加4MB的默认限制。喜欢,
1 2 3 4 5 |
|
类似地,对于ASP.NETCore应用程序,我们可以通过设置maxAllowedContentLength
属性中的web.config
档案。默认的ASP.NETCore应用程序模板不会创建web.config
档案。它是在发布应用程序时创建的。但是,您还可以使用以下代码手动将其添加到应用程序的根目录中(如果不存在的话)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
|
您必须定义maxAllowedContentLength
在保安区。您可以阅读更多关于web.config
ASP.NET核心文件这里.
为了在IIS和Kestrel服务器之间创建反向代理,必须在部署的应用程序的内容根路径(通常是app basepath)上显示web.config文件。这是与提供给IIS的网站物理路径相同的位置。此设置仅适用于IIS。
托管在Kestrel(作为独立的或与Ngnix和Apache服务器)
从ASP.NETCore 2.0.0开始,Kestrel服务器还规定了自己的默认限制。有三种不同的方法来增加这个默认限制。
-
MVC解决方案
如果要更改特定mvc操作或控制器的最大请求体大小限制,可以使用
RequestSizeLimit
属性。喜欢,1
2
3
4
5
6
[HttpPost]
[RequestSizeLimit(40000000)]
public
async
Task<IActionResult> UploadFiles(IFormFile file)
{
//TODO: Save file
}
它为此操作方法设置允许的最大请求长度。可以在操作级别或控制器级别应用此属性。这是推荐方法以增加ASP.NETCoreMVC应用程序的限制。
还有另一个属性
DisableRequestSizeLimit
适用于控制器级别或操作级别,以禁用HTTP请求的大小限制。这将请求限制设置为无限。喜欢,1
2
3
4
5
6
[HttpPost]
[DisableRequestSizeLimit]
public
async
Task<IActionResult> UploadFiles(IFormFile file)
{
//TODO: Save file
}
-
全局解
若要全局修改最大请求体大小,请设置
MaxRequestBodySize
Kestrel的选择。喜欢,1
2
3
4
5
6
7
8
public
static
IWebHostBuilder CreateWebHostBuilder(
string
[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>()
.UseKestrel(options =>
{
options.Limits.MaxRequestBodySize = 52428800;
//50MB
});
}
这适用于对整个应用程序的任何请求。这个
MaxRequestBodySize
是一个可空的长。将其设置为NULL将禁用限制。现在,您可能在想为什么Windows不能工作,因为IIS也使用Kestrel。原因是,对于在IIS后面运行的Kestrel禁用此设置,在IIS中应用正常的web.config限制。虽然这是一个全局设置,但它可以根据每个请求被重写。中间件. -
中间件解决方案
如果要根据请求覆盖全局设置,可以通过中间件进行。这允许您通过一些灵活的配置修改单个请求。喜欢,
1
2
3
4
5
app.UseWhen(context => context.Request.Path.StartsWithSegments(
"/api"
), appBuilder =>
{
context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize =
null
;
//TODO: take next steps
});
请记住,这不能在读取请求体启动后更改。如果在应用程序开始读取请求后尝试配置请求的限制,则会引发异常。有一个
IsReadOnly
属性,该属性指示MaxRequestBodySize
属性处于只读状态,这意味着配置限制为时已晚。
就这样。
摘要
总之,这篇文章提供了增加ASP.NETCore应用程序的请求限制大小的解决方案,涵盖了所有可能的部署选项。根据您的部署模型,您需要进行配置更改。不过,无论部署选项如何,最好有一个单一的解决方案来增加请求限制。让我们希望事情会改变,但就目前而言,我们必须遵循这一点。
感谢您的阅读。继续访问这个博客,并在你的网络中分享。请把你的想法和反馈意见放在评论部分。