kestler MaxRequestBodySize загрузка файла сверх лимита - PullRequest
0 голосов
/ 26 апреля 2018

Я столкнулся со странной проблемой с пустельгой.Я не могу загрузить несколько файлов, которые превышают MaxRequestBodySize kestrel.

Ожидаемое поведение - выбросить BadHttpRequestException при попытке чтения this.Request.Form.Files.GetFiles () .Я ожидаю получить запрос к действию контроллера только один раз.

Происходит то, что действие загрузки загружается несколько раз, и браузер выдает сообщение "conection lost".Я не нашел скороговорки о том, как много раз вызывается действие.

Действие контроллера:

[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
        };
    }
}

view:

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

info: Microsoft.AspNetCore.Server.Kestrel [17] Идентификатор соединения "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.OnReadSterSerCore (в) Microsoft.Kestrel.Core.Internal.Http.MessageBody.TryInit () в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.MessageBody.d__24.MoveNext () --- Конец трассировки стека из предыдущего расположения, где было сгенерировано исключение--- в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в Microsoft.AspNetCore.Server.Kestrel.Core.Internal.`tp.MoveNext () info: Microsoft.AspNetCore.Hosting.Internal.WebHost [2] Запрос завершен в 7618.6319ms 413

Отредактировано Мне известно, что я могу отключить ограничение, но это невозможнов этом случае.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

В соответствии с этим объявлением максимальный лимит можно переопределить глобально для всех действий или, в частности, для одного, используя [RequestSizeLimit(100000000)] (или [DisableRequestSizeLimit] для отключения лимита) для данного действия.

0 голосов
/ 26 апреля 2018

Вы должны настроить две вещи:

В вашем 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 и попробуйте загрузить огромные файлы.

...