Отправка формы в результате "InvalidDataException: значение, формы, рассчитывать лимит 1024 превышен."

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

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

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

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

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

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

3 ответов


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

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

кроме того, я думаю, вы можете просто изменить FormOptions лимит в Автозагрузка.cs.

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

в моем случае, это сработало, изменяя ValueLengthLimit, в автозагрузки.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
    });