2016-07-13 1 views
9

J'ai créé un site mvc et j'envoie une grande quantité de données de formulaire json (Content-Type:application/x-www-form-urlencoded) retour au contrôleur mvc. Lorsque je fais cela, je reçois une réponse 500 qui indique: "InvalidDataException: limite de nombre de valeur de formulaire 1024 dépassée."Soumission de formulaire entraînant "InvalidDataException: limite de nombre de valeurs de formulaire 1024 dépassée."

Dans les versions précédentes de aspnet, vous devez ajouter ce qui suit à la web.config pour augmenter la limite:

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

Quand je mets ces valeurs dans le web.config, je ne vois pas de changement, donc je suppose que Microsoft ne lit plus ces valeurs depuis le web.config. Cependant, je n'arrive pas à déterminer où ces paramètres doivent être réglés.

Toute aide pour augmenter le nombre de valeurs de forme est grandement appréciée!

Pour être clair, cette demande fonctionne parfaitement bien lorsque le nombre d'éléments dans mes données post est inférieure à 1024.

+1

Qu'entendez-vous par «une grande quantité de données de formulaire json»? Publiez-vous des données en tant que type de contenu 'application/x-www-form-urlencoded' ou' application/json'? –

+0

@KiranChalla J'utilise Content-Type: application/x-www-form-urlencoded –

Répondre

11

Vous pouvez modifier la limite de formvalue par défaut en utilisant le FormOptions. Si vous utilisez MVC, vous pouvez créer un filtre et décorer sur l'action où vous souhaitez étendre cette limite et conserver la valeur par défaut pour le reste des actions.

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

action:

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

NOTE: Si votre action doit prendre en charge la validation aussi anti-contrefaçon, vous devrez commander les filtres. Exemple:

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

Cela a fonctionné comme un charme. Merci beaucoup! –

+0

Le code ci-dessus résout le problème mais je pense qu'il y a eu des mises à jour dans les noms de variables dans le nouveau noyau MVC. "ValueCountLimit" est maintenant "" KeyCountLimit "variable J'ai trouvé le même type de code ci-dessus avec des noms de variables corrigés avec la nouvelle version http://stepbystepschools.net/?p=1044 –

+1

il a été mis en œuvre déjà dans la nouvelle version de le noyau asp.net, voir engagement: https://github.com/aspnet/Mvc/commit/17f6b17a6dc0e76606b091187a4e43a184656c89 –