Отправка формы приводит к InvalidDataException: превышен предел количества значений формы 1024.

Я создал сайт mvc и отправляю большое количество данных формы json (Content-Type:application/x-www-form-urlencoded) обратно в контроллер mvc. Когда я делаю это, я получаю ответ 500, в котором говорится: InvalidDataException: превышен предел количества значений формы 1024.

В предыдущих версиях aspnet для увеличения лимита в файл web.config добавлялось следующее:

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="5000" />
    <add key="aspnet:MaxJsonDeserializerMembers" value="5000" />
</appSettings>

Когда я помещаю эти значения в web.config, я не вижу никаких изменений, поэтому я предполагаю, что Microsoft больше не считывает эти значения из web.config. Однако я не могу понять, где эти настройки должны быть установлены.

Любая помощь в увеличении количества значений формы приветствуется!

Чтобы было ясно, этот запрос отлично работает, когда количество элементов в моих данных сообщения меньше 1024.

Обновление: в asp.net MVC Core 3.1 сообщение об ошибке: Не удалось прочитать форму запроса. Превышен предел количества значений формы 1024.


person Michiel Bugher    schedule 13.07.2016    source источник
comment
Что вы имеете в виду под large amount of json form data? Вы публикуете данные как тип контента application/x-www-form-urlencoded или application/json?   -  person Kiran Challa    schedule 13.07.2016
comment
@KiranChalla Я использую Content-Type:application/x-www-form-urlencoded   -  person Michiel Bugher    schedule 13.07.2016


Ответы (6)


Обновление. MVC SDK теперь включает эту функцию через RequestSizeLimitAttribute. Больше нет необходимости создавать настраиваемый атрибут.

Спасибо andrey-bobrov за указание на это в комментарий. Оригинальный ответ ниже, для потомков.


Вы можете изменить ограничение значения формы по умолчанию, используя файл FormOptions. Если вы используете MVC, вы можете создать фильтр и украсить действие, если вы хотите расширить это ограничение и оставить значение по умолчанию для остальных действий.

/// <summary>
/// Filter to set size limits for request form data
/// </summary>
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class RequestFormSizeLimitAttribute : Attribute, IAuthorizationFilter, IOrderedFilter
{
    private readonly FormOptions _formOptions;

    public RequestFormSizeLimitAttribute(int valueCountLimit)
    {
        _formOptions = new FormOptions()
        {
            ValueCountLimit = valueCountLimit
        };
    }

    public int Order { get; set; }

    public void OnAuthorization(AuthorizationFilterContext context)
    {
        var features = context.HttpContext.Features;
        var formFeature = features.Get<IFormFeature>();

        if (formFeature == null || formFeature.Form == null)
        {
            // Request form has not been read yet, so set the limits
            features.Set<IFormFeature>(new FormFeature(context.HttpContext.Request, _formOptions));
        }
    }
}

Действие:

[HttpPost]
[RequestFormSizeLimit(valueCountLimit: 2000)]
public IActionResult ActionSpecificLimits(YourModel model)

ПРИМЕЧАНИЕ. Если ваше действие также должно поддерживать проверку защиты от подделок, вам необходимо заказать фильтры. Пример:

// Set the request form size limits *before* the antiforgery token validation filter is executed so that the
// limits are honored when the antiforgery validation filter tries to read the form. These form size limits
// only apply to this action.
[HttpPost]
[RequestFormSizeLimit(valueCountLimit: 2000, Order = 1)]
[ValidateAntiForgeryToken(Order = 2)]
public IActionResult ActionSpecificLimits(YourModel model)
person Kiran Challa    schedule 13.07.2016
comment
Приведенный выше код решает проблему, но я думаю, что в новом ядре MVC были обновления в именах переменных. ValueCountLimit теперь является переменной KeyCountLimit. Я нашел код того же типа, что и выше, с исправленными именами переменных в новой версии stepbystepschools.net/?p=1044 - person Shivprasad Koirala; 02.11.2016
comment
@AndreyBobrov безопасно ли это увеличивать? Это относится к docs.microsoft.com/en -us/security-updates/securitybulletins/, где увеличение размера сообщения увеличивает вероятность эксплуатации. - person radj; 31.10.2018
comment
Создание настраиваемого атрибута, такого как RequestFormSizeLimit, точно работает, но интересно, какое ограничение следует использовать? Если есть форма, в которой вы можете динамически добавлять элементы управления вводом и выполнять почтовый вызов, чтобы сохранить их, этот предел продолжает увеличиваться. Так кто-нибудь знает, каков максимальный или я должен сказать, что более безопасный предел был бы (для сайта .net core 2.0 и Angular7 SPA)? Спасибо! - person sankar; 29.03.2019
comment
атрибут RequestSizeLimitAttribute недоступен в ASP.NET Core 1.1? - person LP13; 23.05.2019
comment
Также для .Net Core ASP нужны services.Configure‹FormOptions›(options =› { options.MemoryBufferThreshold = 1500000000; options.MultipartBodyLengthLimit = 1500000000; }); в вашем Startup.cs - person Richard Keene; 05.05.2020
comment
Работает для Asp.net Core 3.1 как есть - person Rahatur; 17.03.2021

Ограничение по умолчанию formvalue(not formkey) – 1024.

Кроме того, я думаю, вы можете просто изменить ограничение FormOptions в файле Startup.cs.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<FormOptions>(options =>
    {
        options.ValueCountLimit = int.MaxValue;
    });
}
person Viking    schedule 28.04.2018
comment
Это отлично сработало для меня, используя asp.core. Нашел его в файле startup.cs и изменил на services.Configure‹FormOptions›(x =› x.ValueCountLimit = 8192); - person Smac; 27.06.2018
comment
Это хороший ответ, поскольку он глобально установлен, а не индивидуальный метод. - person Ajay2707; 19.03.2019

В моем случае это сработало, изменив ValueLengthLimit в файле Startup.cs.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<FormOptions>(options =>
    {
        options.ValueCountLimit = 200; // 200 items max
        options.ValueLengthLimit = 1024 * 1024 * 100; // 100MB max len form data
    });
person Wagner Pereira    schedule 28.09.2018
comment
Это отлично сработало для меня в Dotnet Core 2.1! Большое спасибо :-) - person Guppie70; 06.12.2018

Если вы используете .net core 2.1 или выше, вы можете использовать встроенный атрибут RequestFormLimits, как показано ниже, в контроллере или действии:

[RequestFormLimits(ValueCountLimit = 5000)]
public class TestController: Controller

Ссылка на официальные документы

person sankar    schedule 02.04.2019

С .net core 3.1 вам нужно в дополнение к

services.Configure<FormOptions>(options =>
{
    options.ValueCountLimit = int.MaxValue;
});

также

services.AddMvc(options =>
{
    options.MaxModelBindingCollectionSize = int.MaxValue;
});

Найдено здесь: https://stackoverflow.com/a/64500089/14958019

Только с MaxModelBindingCollectionSize я получаю свой объект json с более чем 1024 строками, полностью переданными из javascript с ajax в контроллер mvc.

person doppelff    schedule 07.01.2021

Ограничение количества значений формы в основном общее количество. параметров, которые вы передали в запросе.

Лимит можно установить из Startup.cs:

 services.Configure<FormOptions>(options =>
            {
                options.ValueCountLimit = 199;
            });

Смотрите изображение ниже, я передал 200 параметров в запросе. Ограничение по умолчанию — 1024, но я установил его как 199, поэтому я передаю более 199 параметров, после чего выдает ошибку.

введите здесь описание изображения

введите здесь описание изображения

person prisan    schedule 21.04.2021