В результате формы "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.

Ответ 1

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

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


Вы можете изменить предельное значение формы по умолчанию, используя 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)

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

// 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)

Ответ 2

Предельное значение по умолчанию (не formkey) - 1024.

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

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

Ответ 3

В моем случае это работало путем изменения 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
    });

Ответ 4

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

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

Ссылка на официальные документы - https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.mvc.requestformlimitsattribute?view=aspnetcore-2.1