如何在ASP.NetCore增加文件上传大小

如何在核心中增加文件 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 section.   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 应用的请求限制大小的解决方案,涵盖了所有可能的部署方案。根据你的部署模式,你需要进行配置修改。不过,不管是哪种部署方案,如果有一个增加请求限制的单一解决方案,那将是最理想的。