2016-07-13 35 views
9

Ho creato un sito mvc e sto inviando una grande quantità di dati del modulo JSON (Content-Type:application/x-www-form-urlencoded) al controller mvc. Quando faccio questo, ricevo una risposta 500 che afferma: "InvalidDataException: limite di conteggio del valore del modulo 1024 superato".Invio del modulo risultante in "InvalidDataException: superamento del limite del valore del modulo 1024 superato".

Nelle versioni precedenti di aspnet, è necessario aggiungere il seguente al web.config per aumentare il limite:

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

Quando ho messo questi valori nel web.config, non vedo alcun cambiamento, quindi suppongo che Microsoft non stia più leggendo questi valori da web.config. Tuttavia, non riesco a capire dove queste impostazioni devono essere impostate.

Qualsiasi aiuto nell'aumentare il valore del modulo è molto apprezzato!

Per essere chiari, questa richiesta funziona perfettamente bene quando il numero di articoli in miei dati post è inferiore a 1024.

+1

Cosa intendi per "grande quantità di dati di modulo JSON"? Stai postando dati come tipo di contenuto 'application/x-www-form-urlencoded' o' application/json'? –

+0

@KiranChalla Sto usando Content-Type: application/x-www-form-urlencoded –

risposta

11

È possibile modificare il limite predefinito formvalue utilizzando il FormOptions. Se si utilizza MVC, è possibile creare un filtro e decoro sull'azione in cui si desidera estendere questo limite e mantenere il valore predefinito per il resto delle azioni.

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

Azione:

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

NOTA: Se la vostra azione deve sostenere Antiforgery convalida troppo, allora si avrebbe bisogno di ordinare i filtri. Esempio:

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

Questo ha funzionato come un fascino. Grazie mille! –

+0

Il codice precedente risolve il problema ma penso che ci siano stati aggiornamenti nei nomi delle variabili nel nuovo nucleo MVC. "ValueCountLimit" è ora variabile "" KeyCountLimit ". Ho trovato lo stesso tipo di codice precedente con i nomi delle variabili corrette con la nuova versione http://stepbystepschools.net/?p=1044 –

+1

è stato implementato già nella nuova versione di il nucleo di asp.net, vedi commit: https://github.com/aspnet/Mvc/commit/17f6b17a6dc0e76606b091187a4e43a184656c89 –

Problemi correlati