关注架构师高级俱乐部
开启架构之路
不定期福利发放哦~
架构师高级俱乐部
读完需要
7
分钟速读仅需 3 分钟
/ 如何在核心中增加文件 ASP.NET 大小 /
从ASP.NET 2.0开始最大请求正文大小限制为30MB (+28.6 MiB)。在正常情况下,无需增加 HTTP 请求 body 的大小。但是,当您尝试上传大型文件 (> 30MB) 时,需要增加默认允许的最大限制。在这篇简短的文章中,我们将了解如何在.netcore 应用程序中增加文件 ASP.NET 大小以及控制此限制的各种选项。
1
在核心中增加文件 ASP.NET 大小
正如我们所知 ASP.NET 是独立于平台的,因此您可以在 Windows、Linux 或 Mac 平台上托管它们。换句话说,您可以在 IIS、Ngnix 和 Apache Web 服务器上托管应用程序。Kestrel 是用于 asp.netcore 的跨平台的服务器,默认情况下包含在 netcore ASP.NET 中。Kestrel 可用作独立服务器或被其他服务器反向代理,如 IIS、Nginx 或 Apache。没有单一的解决方案可以覆盖所有的部署选项来增加请求大小限制。根据不同的部署选项,解决方案也不尽相同。我们可能有以下部署选项。
1、托管在 IIS 上(有凯斯特雷尔或没有凯斯特雷尔)
2、托管在 Kestrel 上(作为独立或与 Ngnix 和 Apache 服务器一起托管)
2
在 IIS 上
还能记得在 ASP.NET 中,我们曾经在 web.config 文件中通过设置增加 4MB 的默认限制。就像 maxRequestLength 节点
<configuration><system.web><httpRuntime maxRequestLength="xxx" /></system.web>
</configuration>
同样对于 ASP.NetCore 应用程序我们可以通过在文件设置中设置属性来增加默认的 30MB 的限制。默认的 ASP。NET Core 应用模板没有创建此文件。它在发布应用程序时创建。但是,您也可以使用以下代码将其手工添加(如果没有)到应用程序的根目录maxAllowedContentLengthweb.configweb.config
`<?xml version="1.0" encoding="utf-8"?>
`<?xml version="1.0" encoding="utf-8"?>
<configuration><!-- To customize the asp.net core module uncomment and edit the following p. For more info see https://go.microsoft.com/fwlink/?linkid=838655 --><system.webServer><handlers><remove name="aspNetCore"/><add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/></handlers><aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /><security><requestFiltering><!-- This will handle requests up to 50MB --><requestLimits maxAllowedContentLength="52428800" /></requestFiltering></security></system.webServer>
</configuration>
您需要在 security 部分中进行定义。更多详情可百度maxAllowedContentLengthweb.config为了在 IIS 和 Kestrel 服务器之间创建反向代理,web.config 文件必须出现在已部署应用程序的内容根路径(通常是应用程序 basepath)。这是提供给 IIS 的网站物理路径的相同位置。此设置仅适用于 IIS。
3
托管在 Kestrel 上
从 ASP.NET Core 2.0 开始, Kestrel 服务器也强加了自己的默认限制。有 3 种不同的方法可以增加这个默认限制。
3.1
MVC 解决方案
如果你想改动一个特定的 MVC 接口或控制器的最大请求体大小限制,你可以使用属性。比如 RequestSizeLimit
[HttpPost][RequestSizeLimit(40000000)] public async Task<IActionResult> UploadFiles(IFormFile file){ //TODO: Save file }
该 RequestSizeLimit 操作方法设置允许的最大请求长度。您可以在方法级别或控制器级别应用此属性。这是 ASP.netcore 应用中增加请求体最大限制的推荐方法。还有另一个适用于控制器级别或方法级别的属性来禁用 HTTP 请求的大小限制。这将把请求限制设置为无限制。比如, ableRequestSizeLimit
[HttpPost]
[DisableRequestSizeLimit]
public async Task<IActionResult> UploadFiles(IFormFile file){ //TODO: Save file }
3.2
全局方案
要修改全局最大请求 body 大小,请为 Kestrel 设置选项。比如,MaxRequestBodySize
public static IWebHostBuilder CreateWebHostBuilder(string[] args)
=> WebHost.CreateDefaultBuilder(args).UseStartup<Startup>()
.UseKestrel(options =>
{ options.Limits.MaxRequestBodySize = 52428800; //50MB }); }
这适用于整个应用程序的任何请求。该值是一个可空的长值。将它设置为 null 会禁用该限制。现在你可能会想,为什么这对 windows 不起作用,因为 IIS 也使用 Kestrel。原因是,这个设置对于运行在 IIS 后面的 Kestrel 来说是无效的,在 IIS 后面应用的是正常的 web.config 限制。虽然这是一个全局设置,但它可以通过中间件.MaxRequestBodySize 来覆盖每个请求。
3.3
中间件方案
如果你想基于请求覆盖全局设置,你可以通过中间件来实现。这样你就可以通过一些灵活的配置来修改单个请求。比如
app.UseWhen(context =>
context.Request.Path.StartsWithSegments("/api"), appBuilder
=> { context.Features.Get<IHttpMaxRequestBodySizeFeature>()
.MaxRequestBodySize = null; //TODO: take next steps });
请记住,在读取请求体开始后,不能更改。如果你在应用开始读取请求后试图配置请求的限制,会抛出一个异常。有一个属性可以指示是否处于只读状态,也就是说来不及配置限制了。IsReadOnlyMaxRequestBodySize(只读最大请求体大小)
4
概要
综上所述,本帖提供了增加 ASP.NET Core 应用的请求限制大小的解决方案,涵盖了所有可能的部署方案。根据你的部署模式,你需要进行配置修改。不过,不管是哪种部署方案,如果有一个增加请求限制的单一解决方案,那将是最理想的。