В настоящее время я работаю с Asp.Net Core и MVC6 необходимо загрузить неограниченный размер файла. Я искал его решение, но до сих пор не получаю фактического ответа.
Если у кого-нибудь есть идеи, пожалуйста, помогите.
Спасибо.
В настоящее время я работаю с Asp.Net Core и MVC6 необходимо загрузить неограниченный размер файла. Я искал его решение, но до сих пор не получаю фактического ответа.
Если у кого-нибудь есть идеи, пожалуйста, помогите.
Спасибо.
Другие ответы решают ограничение IIS. Однако, с ASP.NET Core 2.0, сервер Kestrel также накладывает свои собственные ограничения по умолчанию.
Github of KestrelServerLimits.cs
Объявление размера и решения размера тела запроса (приведено ниже)
Если вы хотите изменить ограничение размера тела максимального запроса для определенного действия или контроллера 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;
Вероятно, вы получаете код статуса 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>
В проекте 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();
}
В вашем web.config:
<system.webServer>
<security>
<requestFiltering>
<requestLimits maxAllowedContentLength="2147483648" />
</requestFiltering>
</security>
</system.webServer>
Вручную отредактируйте файл ApplicationHost.config:
ApplicationHost.config
найдите узел <requestLimits>
.Удалите свойство maxAllowedContentLength
. Или добавьте значение, соответствующее размеру заголовка Content-Length, который клиент отправляет как часть запроса. По умолчанию значение свойства maxAllowedContentLength
равно 30000000.
Сохраните файл ApplicationHost.config
.
Я добавлю это для полноты информации о других несчастливых парнях вроде меня, которые оказались здесь, источник
В Startup.cs
:
services.Configure<FormOptions>(options =>
{
options.MultipartBodyLengthLimit = 60000000;
});
Использование 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>