如何在ASP.NETCore中增加文件上载大小

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

<configuration>

  <system.web>

    <httpRuntime maxRequestLength="xxx" />

  </system.web>

</configuration>

类似地,对于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

<?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>

您必须定义maxAllowedContentLength在保安区。您可以阅读更多关于web.configASP.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

    }

  • 全局解

    若要全局修改最大请求体大小,请设置MaxRequestBodySizeKestrel的选择。喜欢,

    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应用程序的请求限制大小的解决方案,涵盖了所有可能的部署选项。根据您的部署模型,您需要进行配置更改。不过,无论部署选项如何,最好有一个单一的解决方案来增加请求限制。让我们希望事情会改变,但就目前而言,我们必须遵循这一点。

感谢您的阅读。继续访问这个博客,并在你的网络中分享。请把你的想法和反馈意见放在评论部分。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值