如何提升 Kestrel 上传文件的大小限制?

咨询区

  • ToddBFisher

我的程序是 ASP.NET Core WebApp,我希望上传一个大的文件,我知道在 IIS 中可以轻松的在 web.config 中做如下配置即可,参考如下代码:

<system.webServer>
    <security>
        <requestFiltering>
            <!--<requestLimits maxAllowedContentLength="1073741824"/>-->
            <requestLimits maxAllowedContentLength="2147483648"/>
        </requestFiltering>
    </security>
</system.webServer>

请问当用 Kestrel 承载的 ASP.NET Core 时如何处理?我现在得到的错误都是 Request body too large

回答区

  • ToddBFisher

我在 github 的 issue 上找到了答案 https://github.com/aspnet/Announcements/issues/267  ,在 ASP.NET Core 2.0 中默认 body 的最大尺寸是 28.6MB,更重要的还说出了如何绕过它,总的来说,在单个 Controller 或者 Action 上标注 [DisableRequestSizeLimit] 特性可以让当前的 body 无限制,或者干脆设一个特别大的值 [RequestSizeLimit(100_000_000)]

如果你要设置全局作用域,需要在 BuildWebHost() 方法中动手脚,在 Program.cs 中添加 .UseKestrel 选项,参考如下代码:

public class Program
    {
        public static void Main(string[] args)
        {
            CreateWebHostBuilder(args).Build().Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args)
        {
            return WebHost.CreateDefaultBuilder(args)
                      .UseStartup<Startup>()
                      .UseKestrel(options =>
                      {
                          options.Limits.MaxRequestBodySize = null;
                      });
        }
    }
  • Akbar Asghari

楼上的回答是 ASP.NET Core 2.0 版本,如果你想用 NET Core 3.x web API 系列的解决方案,代码应该像下面这样。

public class Program
{
    public static void Main(string[] args)
    {
        CreateHostBuilder(args).Build().Run();
    }

    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>();
                webBuilder.UseKestrel(options =>
                {
                    options.Limits.MaxRequestBodySize = null;
                });
            });
}

点评区

其实你会发现在 .NET Core 系列版本中,每个版本之间写法变动还是挺大的,比如说:2.23.0 不一样,3.06.0 又不一样了,下面是 6.0 的写法。

var builder = WebApplication.CreateBuilder(args);

builder.WebHost.UseKestrel(so =>
{
    so.Limits.MaxRequestBodySize = null;
});

// Add services to the container.
builder.Services.AddControllersWithViews();

var app = builder.Build();

app.UseRouting();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

总的来说,挺纠结,学无止境 😄

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
.NET Core ,可以通过以下方式配置上传文件大小限制: 1. 在 Startup.cs 文件,找到 ConfigureServices 方法,在方法添加以下代码: ``` services.Configure<IISServerOptions>(options => { options.MaxRequestBodySize = 104857600; // 100MB }); ``` 其,MaxRequestBodySize 属性表示上传文件的最大限制,以字节为单位。 2. 如果是使用 Kestrel 服务器,则可以在 Program.cs 文件的 CreateHostBuilder 方法添加以下代码: ``` public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseKestrel(options => { options.Limits.MaxRequestBodySize = 104857600; // 100MB }); webBuilder.UseStartup<Startup>(); }); ``` 其,MaxRequestBodySize 属性同样表示上传文件的最大限制,以字节为单位。 需要注意的是,以上两种方式可以同时存在,但是以 Kestrel 配置为准。另外,在配置文件也可以进行上传文件大小的配置,例如 appsettings.json 文件: ``` { "AllowedHosts": "*", "MaxAllowedContentLength": 104857600 // 100MB } ``` 其,MaxAllowedContentLength 属性同样表示上传文件的最大限制,以字节为单位。这种方式需要在 Startup.cs 文件ConfigureServices 方法添加以下代码: ``` services.Configure<IISServerOptions>(options => { options.MaxAllowedContentLength = Configuration.GetValue<long>("MaxAllowedContentLength"); }); ``` 需要引入 Microsoft.Extensions.Configuration 包。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值