Kestrel MaxRequestBodySize 上传文件超过限制

问题描述 投票:0回答:3

我确实遇到了红隼的一个奇怪问题。我无法上传超过 kestrel MaxRequestBodySize 的多个文件。

预期的行为是当我尝试读取 this.Request.Form.Files.GetFiles() 时抛出 BadHttpRequestException。我确实希望只收到一次对控制器操作的请求。

发生的情况是上传操作被点击了几次,并且浏览器显示消息“连接丢失”。我没有找到有关该操作被调用多少次的信息。

控制器动作:

[HttpPost("upload")]
public IActionResult Upload()
{
    try
    {
        var files = this.Request.Form.Files.GetFiles("files");
        files.Select(async file => await this.SaveFile(file))
        return this.RedirectToAction(nameof(VueController.FilesList),"Vue");
    }
    catch (BadHttpRequestException exp)
    {
        return new string[]
        {
            exp.Message
        };
    }
}

查看:

<form method="post"
          enctype="multipart/form-data"
          action="/api/v1/files/upload"
          novalidate="novalidate">
      <input type="file"
             name="files"
             multiple="multiple"
             required="required"
             accept=""
             capture="capture" />
    </form>

asp.net 核心日志:

信息:Microsoft.AspNetCore.Server.Kestrel[17] 连接 ID“0HLDB9K94VV9M”请求数据错误:“请求正文太大。” Microsoft.AspNetCore.Server.Kestrel.Core.BadHttpRequestException: 请求正文太大。在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame.ThrowRequestRejected(RequestRejectionReason 原因)在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.ForContentLength.OnReadStart() 在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.TryInit() 在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.d__24.MoveNext() --- 从先前抛出异常的位置开始的堆栈跟踪结束 --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.Frame`1.d__2.MoveNext() 信息:Microsoft.AspNetCore.Hosting.Internal.WebHost[2] 请求在 7618.6319ms 内完成 413

已编辑 我知道我可以禁用该限制,但在这种情况下这是不可能的。

.net asp.net-core kestrel-http-server
3个回答
11
投票

您必须配置两件事:

在你的Program.cs中

public static IWebHost BuildWebhost(string[] args) => 
   WebHost.CreateDefaultBuilder(args)
      .UseStartup<Startup>()
      .UseKestrel(options => {
           options.Limits.MaxRequestBodySize = null; // or a given limit
      })
     .Build();

在 Startup.cs 的ConfigureService 方法中

services.Configure<FormOptions>(options => options.MultipartBodyLengthLimit = long.MaxValue); // or other given limit

同时更改您的控制器端点以使用

[FromForm]

public IActionResult Upload([FromForm] IEnumerable<IFormFile> files)... // name must be same as name attribute of your multipart form

现在 ASP.NET Core 将完成工作并按顺序从表单注入文件。

编辑:

我创建了一个可以从 github 克隆的示例:

git clone https://github.com/alsami/example-fileupload-aspnet-core.git
cd example-fileupload-aspnet-core
dotnet restore
dotnet run --project src/file-upload-api/file-upload-api.csproj

然后导航到 http://localhost:5000/index.html 并尝试上传大文件。


2
投票

根据此公告,可以在全局范围内覆盖所有操作的最大限制,或者在给定操作上使用

[RequestSizeLimit(100000000)]
(或
[DisableRequestSizeLimit]
禁用限制)专门针对单个操作。


0
投票

对于多个文件上传操作应该是这样的;

[HttpPost]
[RequestSizeLimit(1000 * 1024 * 1024)]
[RequestFormLimits(MultipartBodyLengthLimit = 1000 * 1024 * 1024)]
public async Task<IActionResult> Index(IList<IFormFile> files)
© www.soinside.com 2019 - 2024. All rights reserved.