当前位置: 代码迷 >> 综合 >> 如何提升 Kestrel 上传文件的大小限制?
  详细解决方案

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

热度:64   发布时间:2024-01-12 07:21:45.0

咨询区

  • 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();

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