Увеличить размер загружаемого файла в ядре Asp.Net

В настоящее время я работаю с Asp.Net Core и MVC6 необходимо загрузить неограниченный размер файла. Я искал его решение, но до сих пор не получаю фактического ответа.

Я пробовал эту ссылку

Если у кого-нибудь есть идеи, пожалуйста, помогите.

Спасибо.

Ответ 1

Другие ответы решают ограничение IIS. Однако, с ASP.NET Core 2.0, сервер Kestrel также накладывает свои собственные ограничения по умолчанию.

Github of KestrelServerLimits.cs

Объявление размера и решения размера тела запроса (приведено ниже)

Инструкции MVC

Если вы хотите изменить ограничение размера тела максимального запроса для определенного действия или контроллера MVC, вы можете использовать атрибут RequestSizeLimit. Следующее позволило бы MyAction принимать тела запросов до 100 000 000 байтов.

[HttpPost]
[RequestSizeLimit(100_000_000)]
public IActionResult MyAction([FromBody] MyViewModel data)
{

[DisableRequestSizeLimit] может использоваться для неограниченного размера запроса. Это эффективно восстанавливает поведение до 2.0.0 только для атрибута действия или контроллера.

Общие инструкции промежуточного ПО

Если запрос не обрабатывается действием MVC, ограничение может быть изменено для каждого запроса с использованием IHttpMaxRequestBodySizeFeature. Например:

app.Run(async context =>
{
    context.Features.Get<IHttpMaxRequestBodySizeFeature>().MaxRequestBodySize = 100_000_000;

MaxRequestBodySize имеет длину, равную нулю. Установка его в значение null отключает предел, такой как MVC [DisableRequestSizeLimit].

Вы можете настроить лимит только на запрос, если приложение еще не начало читать; в противном случае создается исключение. Theres a IsReadOnly свойство, которое сообщает вам, что свойство MaxRequestBodySize находится в состоянии только для чтения, что означает, что слишком поздно настроить предел.

Инструкции глобальной конфигурации

Если вы хотите изменить максимальный размер тела запроса во всем мире, это можно сделать, изменив свойство MaxRequestBodySize в обратном вызове либо UseKestrel, либо UseHttpSys. MaxRequestBodySize в обоих случаях является долговечным с нулевым значением. Например:

.UseKestrel(options =>
{
    options.Limits.MaxRequestBodySize = null;

или

.UseHttpSys(options =>
{
    options.MaxRequestBodySize = 100_000_000;

Ответ 2

Вероятно, вы получаете код статуса HTTP 404.13 при загрузке любого файла более 30 МБ. Если вы запускаете приложение ASP.Net Core в IIS, то конвейер IIS перехватывает ваш запрос до того, как он попадет в ваше приложение.

Обновите файл web.config:

<system.webServer>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
    </handlers>
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>
    <!-- Add this section for file size... -->
    <security>
      <requestFiltering>
        <!-- Measured in Bytes -->
        <requestLimits maxAllowedContentLength="1073741824" />  <!-- 1 GB-->
      </requestFiltering>
    </security>
  </system.webServer>

Предыдущие приложения ASP.Net также нуждались в этом разделе, но больше не нужны в Core, так как ваши запросы обрабатываются промежуточным программным обеспечением:

  <system.web>
    <!-- Measured in kilobytes -->
    <httpRuntime maxRequestLength="1048576" />
  </system.web>

Ответ 3

В проекте ASP.NET Core 1.1, созданном Visual Studio 2017, если вы хотите увеличить размер загружаемого файла. Вам нужно создать файл web.config самостоятельно и добавить следующее содержимое:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
      <requestFiltering>
        <!-- 1 GB -->
        <requestLimits maxAllowedContentLength="1073741824" />
      </requestFiltering>
    </security>
  </system.webServer>
</configuration>

В файле Startup.cs добавьте следующее содержимое:

public void ConfigureServices(IServiceCollection services)
{
  services.Configure<FormOptions>(x =>
  {
      x.ValueLengthLimit = int.MaxValue;
      x.MultipartBodyLengthLimit = int.MaxValue;
      x.MultipartHeadersLengthLimit = int.MaxValue;
  });

  services.AddMvc();
}

Ответ 4

  1. В вашем web.config:

    <system.webServer>
      <security>
        <requestFiltering>
          <requestLimits maxAllowedContentLength="2147483648" />
        </requestFiltering>
      </security>
    </system.webServer>
    
  2. Вручную отредактируйте файл ApplicationHost.config:

    1. Нажмите Пуск. В поле Начать поиск введите Блокнот. Щелкните правой кнопкой мыши Блокнот и выберите "Запуск от имени администратора".
    2. В меню Файл выберите Открыть. В поле Имя файла введите "% windir%\system32\inetsrv\config\applicationhost.config" и нажмите кнопку "Открыть".
    3. В файле ApplicationHost.config найдите узел <requestLimits>.
    4. Удалите свойство maxAllowedContentLength. Или добавьте значение, соответствующее размеру заголовка Content-Length, который клиент отправляет как часть запроса. По умолчанию значение свойства maxAllowedContentLength равно 30000000.

      enter image description here

    5. Сохраните файл ApplicationHost.config.

Ответ 5

Я добавлю это для полноты информации о других несчастливых парнях вроде меня, которые оказались здесь, источник

В Startup.cs:

services.Configure<FormOptions>(options =>
{
    options.MultipartBodyLengthLimit = 60000000;
});

Ответ 6

Использование web.config может поставить под угрозу архитектуру ядра .NET, и вы можете столкнуться с проблемой при развертывании решения в Linux или на Mac.

Лучше использовать Startup.cs для настройки этого параметра: Пример:

services.Configure<FormOptions>(x =>
{
    x.ValueLengthLimit = int.MaxValue;
    x.MultipartBodyLengthLimit = int.MaxValue; // In case of multipart
});

Вот исправление:

Вам также необходимо добавить web.config, потому что, когда запрос попадает в IIS, он ищет web.config и проверяет максимальную длину загрузки: sample:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <security>
     <requestFiltering>
    <!-- 1 GB -->
     <requestLimits maxAllowedContentLength="1073741824" />
  </requestFiltering>
</security>