Posso impostare una lunghezza illimitata per maxJsonLength in web.config?


663

Sto usando la funzione di completamento automatico di jQuery. Quando provo a recuperare l'elenco di oltre 17000 record (ognuno non avrà più di 10 caratteri di lunghezza), supera la lunghezza e genera l'errore:

Informazioni sull'eccezione:
Tipo di eccezione: InvalidOperationException
Messaggio di eccezione: errore durante la serializzazione o la deserializzazione mediante JSON JavaScriptSerializer. La lunghezza della stringa supera il valore impostato sulla proprietà maxJsonLength.

Posso impostare una lunghezza illimitata per maxJsonLengthin web.config? In caso contrario, qual è la lunghezza massima che posso impostare?


1
Qualcosa da menzionare che può essere abbastanza ovvio, quindi per favore scusami se hai già pensato se; la stringa Json include anche le parentesi graffe attorno a ciascun record, le virgolette attorno a ciascun nome di campo [e valore], nonché il nome e il valore del campo. Quindi può essere utile impostare il nome del campo come un singolo carattere e assicurarsi anche che se il valore non è una stringa, si imposti correttamente il tipo di campo in modo che non contenga virgolette.
MichaelJTaylor

Risposte:


720

NOTA: questa risposta si applica solo ai servizi Web, se si restituisce JSON da un metodo Controller, assicurarsi di leggere anche questa risposta SO di seguito: https://stackoverflow.com/a/7207539/1246870


La proprietà MaxJsonLength non può essere illimitata, è una proprietà intera che per impostazione predefinita è 102400 (100k).

Puoi impostare la MaxJsonLengthproprietà sul tuo web.config:

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration> 

153
È un numero intero quindi il valore massimo che puoi impostare è: 2147483644
David Espart

58
@despart: intendi 2 147 483 647.
Dercsár,

6
@ kmcc049, IMO i valori non sono sbagliati perché se si guarda alla domanda, l'OP non chiede "qual è il valore predefinito di maxJsonLength?" (A proposito, la seconda risposta più votata sta rispondendo a questa, domanda sbagliata), sta cercando di impostare questa proprietà su "illimitato", ma poiché è un numero intero, il valore massimo possibile è 2147483647come sottolinea @depsart e @ Descár.
CMS,

11
Ottimo, ma nota la risposta di @David Murdoch di seguito se riscontri questo problema quando usi MVC return Json()o qualcosa del genere
British Devevoper

3
@Dercsár: qual è il punto? 2147483644 è il numero intero più grande perfettamente divisibile per 1024.
naveen

461

Se stai usando MVC 4 , assicurati di controllare anche questa risposta .


Se continui a ricevere l'errore:

  • dopo aver impostato la maxJsonLengthproprietà sul valore massimo in web.config
  • e sai che la lunghezza dei tuoi dati è inferiore a questo valore
  • e non stai utilizzando un metodo di servizio Web per la serializzazione JavaScript

il tuo problema è probabile che:

Il valore della proprietà MaxJsonLength si applica solo all'istanza JavaScriptSerializer interna utilizzata dal livello di comunicazione asincrono per richiamare i metodi dei servizi Web. ( MSDN: proprietà ScriptingJsonSerializationSection.MaxJsonLength )

Fondamentalmente, "interno" JavaScriptSerializerrispetta il valore di maxJsonLengthquando chiamato da un metodo web; l'uso diretto di un JavaScriptSerializer(o l'uso tramite un controller / metodo di azione MVC) non rispetta la maxJsonLengthproprietà, almeno non dalla systemWebExtensions.scripting.webServices.jsonSerializationsezione di web.config.

Per ovviare al problema, è possibile effettuare le seguenti operazioni all'interno del proprio controller (o in qualsiasi altro luogo):

var serializer = new JavaScriptSerializer();

// For simplicity just use Int32's max value.
// You could always read the value from the config section mentioned above.
serializer.MaxJsonLength = Int32.MaxValue;

var resultData = new { Value = "foo", Text = "var" };
var result = new ContentResult{
    Content = serializer.Serialize(resultData),
    ContentType = "application/json"
};
return result;

Questa risposta è la mia interpretazione di questa risposta al forum asp.net .


5
La tua risposta è stata davvero utile poiché sto usando il Json()metodo del risultato dell'azione in asp.net mvc.
jessegavin,

3
Sì, anch'io soffrivo di Json (). Grazie!
British Devevoper

3
Sebbene sia completamente corretto e meritevole del suo posto, questa è una di quelle domande in cui vale la pena leggere oltre la risposta migliore :). Grazie!
Nigel,

3
Se stai usando MVC4, vedi anche la risposta di @fanisch.
Oltre l'

4
Che ne dici di deserializzazione? Ho riscontrato questo errore nell'associazione del modello di azione.
Guogangj,

345

In MVC 4 puoi fare:

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult()
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior,
        MaxJsonLength = Int32.MaxValue
    };
}

nel tuo controller.

aggiunta:

Per chiunque sia perplesso dai parametri che è necessario specificare, una chiamata potrebbe apparire così:

Json(
    new {
        field1 = true,
        field2 = "value"
        },
    "application/json",
    Encoding.UTF8,
    JsonRequestBehavior.AllowGet
);

6
Posso confermare che quanto sopra funziona come un fascino in MVC 4, grazie fanisch.
Oltre l'

9
Posso anche confermare. Inserire questo codice in un controller di base è sicuramente l'approccio più pulito proposto.
parlamento

15
Questo funziona anche aggiungendo semplicemente "MaxJsonLength = Int32.MaxValue" al risultato dell'azione individuale. Nel caso in cui non si desideri modificare il controller o l'intero progetto.
Ipnovirus il

3
Questa è la risposta migliore MaxJsonLength può essere configurato per controller.
liang,

3
ATTENZIONE: questa soluzione disabilita la compressione (se richiesta) della risposta. Aggiungere questo filtro sulla vostra azione: stackoverflow.com/questions/3802107/...
Gorgi Rankovski

60

È possibile configurare la lunghezza massima per le richieste json nel file web.config:

<configuration>
    <system.web.extensions>
        <scripting>
            <webServices>
                <jsonSerialization maxJsonLength="....">
                </jsonSerialization>
            </webServices>
        </scripting>
    </system.web.extensions>
</configuration>

Il valore predefinito per maxJsonLength è 102400 . Per ulteriori dettagli, consultare questa pagina MSDN: http://msdn.microsoft.com/en-us/library/bb763183.aspx


1
Qual è il valore memorizzato in questo numero intero che rappresenta? È una specie di conteggio del personaggio? Immagino che quello che chiedo sia: perché viene utilizzato un numero intero? Grazie!
eaglei22,

@ eaglei22 il numero rappresenta il numero di byte che è possibile utilizzare per maxJsonLength. Come menzionato M4N, 102400 è l'impostazione predefinita (100 KB).
Jacob Plonke,

questo non ha funzionato per me e non ho usato i servizi web.
Kalai,

42

se ricevi ancora errori dopo l'impostazione web.config come segue:

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration> 

L'ho risolto seguendo:

   public ActionResult/JsonResult getData()
   {
      var jsonResult = Json(superlargedata, JsonRequestBehavior.AllowGet);
      jsonResult.MaxJsonLength = int.MaxValue;
      return jsonResult;
    }

Spero che questo dovrebbe aiutare.


2
L'impostazione di maxJsonLength in web.config non è facile, l'impostazione di jsonResult.MaxJsonLength dovrebbe essere sufficiente (almeno per me (MVC5))
hormberg

Questo va bene perché non è un cambiamento globale.
rob_james

40

Stavo riscontrando questo problema in ASP.NET Web Forms. Stava ignorando completamente le impostazioni del file web.config, quindi ho fatto questo:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

Naturalmente nel complesso questa è una pratica terribile. Se stai inviando così tanti dati in una chiamata al servizio web, dovresti considerare un approccio diverso.


1
ha funzionato per te? dove hai inserito questo codice?
user1012598

Il nostro problema era perché avevamo un'area di testo che consentiva l'HTML e le persone stavano incorporando immagini come HTML, il che faceva sì che la voce diventasse molto grande e il serializzatore JSON fallisse. Immagino che se si può fare, gli utenti lo faranno ...
Marko,

Descrivi dove dovremmo inserire questo codice ... @Flea
Koray Durudogan,

@KorayDurudogan - Ho inserito questo nel metodo Ajax che stava restituendo la risposta, quindi nel mio controller. Spero che aiuti!
Pulce,

Non sto sfidando la tua risposta, ma sto cercando di farmi un'idea di quali approcci migliori ci siano. Ho una domanda che, in base ai criteri dell'utente, determinerà la dimensione del risultato. Restituisco un JsonResult, importerebbe se restituissi un file Excel?
eaglei22,

22

L'ho riparato.

//your Json data here
string json_object="........";
JavaScriptSerializer jsJson = new JavaScriptSerializer();
jsJson.MaxJsonLength = 2147483644;
MyClass obj = jsJson.Deserialize<MyClass>(json_object);

Funziona molto bene


Eccezionale! Questa è l'unica soluzione che ha funzionato per me ed è comunque migliore poiché non è un cambiamento globale. Grazie!
Sealer_05,

20

Ho seguito la risposta di Vestigal e sono arrivato a questa soluzione:

Quando avessi bisogno di inviare un json di grandi dimensioni a un'azione in un controller, avrei ricevuto il famoso "Errore durante la deserializzazione utilizzando JSON JavaScriptSerializer. La lunghezza della stringa supera il valore impostato sulla proprietà maxJsonLength. \ R \ n Nome parametro: input fornitore di valore ".

Quello che ho fatto è stato creare un nuovo ValueProviderFactory, LargeJsonValueProviderFactory e impostare MaxJsonLength = Int32.MaxValue nel metodo GetDeserializedObject

public sealed class LargeJsonValueProviderFactory : ValueProviderFactory
{
private static void AddToBackingStore(LargeJsonValueProviderFactory.EntryLimitedDictionary backingStore, string prefix, object value)
{
    IDictionary<string, object> dictionary = value as IDictionary<string, object>;
    if (dictionary != null)
    {
        foreach (KeyValuePair<string, object> keyValuePair in (IEnumerable<KeyValuePair<string, object>>) dictionary)
            LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);
    }
    else
    {
        IList list = value as IList;
        if (list != null)
        {
            for (int index = 0; index < list.Count; ++index)
                LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakeArrayKey(prefix, index), list[index]);
        }
        else
            backingStore.Add(prefix, value);
    }
}

private static object GetDeserializedObject(ControllerContext controllerContext)
{
    if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
        return (object) null;
    string end = new StreamReader(controllerContext.HttpContext.Request.InputStream).ReadToEnd();
    if (string.IsNullOrEmpty(end))
        return (object) null;

    var serializer = new JavaScriptSerializer {MaxJsonLength = Int32.MaxValue};

    return serializer.DeserializeObject(end);
}

/// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
/// <returns>A JSON value-provider object for the specified controller context.</returns>
/// <param name="controllerContext">The controller context.</param>
public override IValueProvider GetValueProvider(ControllerContext controllerContext)
{
    if (controllerContext == null)
        throw new ArgumentNullException("controllerContext");
    object deserializedObject = LargeJsonValueProviderFactory.GetDeserializedObject(controllerContext);
    if (deserializedObject == null)
        return (IValueProvider) null;
    Dictionary<string, object> dictionary = new Dictionary<string, object>((IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase);
    LargeJsonValueProviderFactory.AddToBackingStore(new LargeJsonValueProviderFactory.EntryLimitedDictionary((IDictionary<string, object>) dictionary), string.Empty, deserializedObject);
    return (IValueProvider) new DictionaryValueProvider<object>((IDictionary<string, object>) dictionary, CultureInfo.CurrentCulture);
}

private static string MakeArrayKey(string prefix, int index)
{
    return prefix + "[" + index.ToString((IFormatProvider) CultureInfo.InvariantCulture) + "]";
}

private static string MakePropertyKey(string prefix, string propertyName)
{
    if (!string.IsNullOrEmpty(prefix))
        return prefix + "." + propertyName;
    return propertyName;
}

private class EntryLimitedDictionary
{
    private static int _maximumDepth = LargeJsonValueProviderFactory.EntryLimitedDictionary.GetMaximumDepth();
    private readonly IDictionary<string, object> _innerDictionary;
    private int _itemCount;

    public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
    {
        this._innerDictionary = innerDictionary;
    }

    public void Add(string key, object value)
    {
        if (++this._itemCount > LargeJsonValueProviderFactory.EntryLimitedDictionary._maximumDepth)
            throw new InvalidOperationException("JsonValueProviderFactory_RequestTooLarge");
        this._innerDictionary.Add(key, value);
    }

    private static int GetMaximumDepth()
    {
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
            int result;
            if (values != null && values.Length > 0 && int.TryParse(values[0], out result))
                return result;
        }
        return 1000;
     }
  }
}

Quindi, nel metodo Application_Start di Global.asax.cs, sostituire ValueProviderFactory con quello nuovo:

protected void Application_Start()
{
    ...

    //Add LargeJsonValueProviderFactory
    ValueProviderFactory jsonFactory = null;
    foreach (var factory in ValueProviderFactories.Factories)
    {
        if (factory.GetType().FullName == "System.Web.Mvc.JsonValueProviderFactory")
        {
            jsonFactory = factory;
            break;
        }
    }

    if (jsonFactory != null)
    {
        ValueProviderFactories.Factories.Remove(jsonFactory);
    }

    var largeJsonValueProviderFactory = new LargeJsonValueProviderFactory();
    ValueProviderFactories.Factories.Add(largeJsonValueProviderFactory);
}

1
Ho fatto tutto il possibile, solo la tua risposta mi ha salvato la giornata, questa dovrebbe essere una risposta accettata
Muhammad Waqas Aziz

Con questo codice siamo in grado di ignorare il limite massimo di deserializzazione del controller MVC max json di 4 mb, ma esiste un modo per ignorare il limite massimo di deserializzazione del controller web-api
Muhammad Waqas Aziz

17

se, dopo aver implementato la suddetta aggiunta nel tuo web.config, ottieni una "sezione di configurazione non riconosciuta system.web.extensions". errore quindi prova ad aggiungere questo al tuo web.config nella <ConfigSections>sezione:

            <sectionGroup name="system.web.extensions" type="System.Web.Extensions">
              <sectionGroup name="scripting" type="System.Web.Extensions">
                    <sectionGroup name="webServices" type="System.Web.Extensions">
                          <section name="jsonSerialization" type="System.Web.Extensions"/>
                    </sectionGroup>
              </sectionGroup>
        </sectionGroup>

4
Stavo avendo questo problema. Tuttavia, questa risposta non ha funzionato per me. Invece di aggiungere l'elemento <sectionGroup> descritto qui, ho appena spostato l'intero blocco <system.web.extensions> appena aggiunto alla fine del mio web.config ... proprio prima di </configuration>. Quindi ha funzionato.
ClearCloud8

Ciò ha aiutato, ma nella mia situazione avevo bisogno di cambiare la tua quarta riga in <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>, come visto in questa pagina: forums.asp.net/t/1446510.aspx/1
Nathan,

@ ClearCloud8 Trasforma immediatamente quel commento in questa pagina.
Jack Nutkins,

11

puoi scrivere questa riga nel controller

json.MaxJsonLength = 2147483644;

puoi anche scrivere questa riga in web.config

<configuration>
  <system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>
  </system.web.extensions>

`

Per essere al sicuro, usa entrambi.


10

Se si riceve questo errore dal MiniProfiler in MVC, è possibile aumentare il valore impostando la proprietà MiniProfiler.Settings.MaxJsonResponseSizesul valore desiderato. Per impostazione predefinita, questo strumento sembra ignorare il valore impostato in config.

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

Cortesia mvc-mini-profiler .


10

Basta impostare la proprietà MaxJsonLength nel metodo Action di MVC

JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;

9

Suggerisco di impostarlo su Int32.MaxValue.

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;

9

Che ne dici di qualche attributo magico?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class MaxJsonSizeAttribute : ActionFilterAttribute
{
    // Default: 10 MB worth of one byte chars
    private int maxLength = 10 * 1024 * 1024;

    public int MaxLength
    {
        set
        {
            if (value < 0) throw new ArgumentOutOfRangeException("value", "Value must be at least 0.");

            maxLength = value;
        }
        get { return maxLength; }
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        JsonResult json = filterContext.Result as JsonResult;
        if (json != null)
        {
            if (maxLength == 0)
            {
                json.MaxJsonLength = int.MaxValue;
            }
            else
            {
                json.MaxJsonLength = maxLength;
            }
        }
    }
}

Quindi è possibile applicarlo a livello globale utilizzando la configurazione del filtro globale o controller / azione.


Bella risposta. Bel uso di attributi personalizzati. Ti stai chiedendo se esiste un motivo (tecnico) specifico per cui hai impostato il valore predefinito su 10 MB di caratteri a 1 byte anziché su Max (int.MaxValue)?
Josh,

@Josh No, non c'era alcun motivo speciale per quello.
Balázs,

5

La domanda è davvero se hai davvero bisogno di restituire dischi 17k? Come pensi di gestire tutti i dati nel browser? Gli utenti non scorreranno comunque tra le 17000 righe.

Un approccio migliore è recuperare solo i "primi pochi" record e caricarne di più secondo necessità.


1
L'elenco predefinito di json fornirà 17k record. Ma la funzione di completamento automatico elencherà solo i record che corrispondono ai caratteri digitati dall'utente, quindi non sarà necessario scorrere di più l'elenco. Quindi quello di cui ho bisogno è impostare una lunghezza illimitata per maxJsonLength che può serializzare i dati 17k.
Prasad,

6
È possibile utilizzare una combinazione di filtro lato server e client. Potrebbe essere difficile filtrare tutti i dati sul lato client, per non parlare della latenza della rete.
Chetan Sastry,

1
Essendo arrivato allo stesso problema qualche tempo fa, ho scelto di implementare un gestore "onsearch" per il completamento automatico, e ho fatto in modo che la chiamata al servizio web passasse il testo "cerca" e facesse una query Top10 usando i criteri di ricerca come filtro. Ciò significava più richieste Ajax individuali, che ottenevano solo l'elenco completo al caricamento della pagina, ma significava anche che tutte le richieste / risposte erano molto più piccole.
Mike U,

3

Puoi impostarlo nella configurazione come altri hanno già detto, oppure puoi impostare una singola istanza del serializzatore come:

var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };

3

Per coloro che hanno problemi con MVC3 con JSON che viene automaticamente deserializzato per un raccoglitore di modelli ed è troppo grande, ecco una soluzione.

  1. Copia il codice per la classe JsonValueProviderFactory dal codice sorgente MVC3 in una nuova classe.
  2. Aggiungere una riga per modificare la lunghezza massima di JSON prima che l'oggetto venga deserializzato.
  3. Sostituisci la classe JsonValueProviderFactory con la tua nuova classe modificata.

Grazie a http://blog.naver.com/techshare/100145191355 e https://gist.github.com/DalSoft/1588818 per avermi indicato nella giusta direzione per come fare. L'ultimo collegamento sul primo sito contiene il codice sorgente completo per la soluzione.


3

Se si riscontra questo tipo di problema in Visualizza, è possibile utilizzare il metodo seguente per risolverlo. Qui ho usato il pacchetto Newtonsoft .

@using Newtonsoft.Json
<script type="text/javascript">
    var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
</script>

Questo significa che non devo preoccuparmi della lunghezza massima se uso Json.NET? Non penso che ci sia un modo per impostare la lunghezza massima in Json.NET, quindi spero che funzioni immediatamente.
Kimbaudi,

1
Ottima risposta grazie! Questo ha funzionato anche quando stavo tentando di caricare un oggetto.
user1299379

3
 JsonResult result = Json(r);
 result.MaxJsonLength = Int32.MaxValue;
 result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 return result;

2

Sembra che non ci sia un valore "illimitato". L'impostazione predefinita è 2097152 caratteri, che equivale a 4 MB di dati stringa Unicode.

Come già osservato, 17.000 record sono difficili da usare bene nel browser. Se si presenta una vista aggregata, potrebbe essere molto più efficiente eseguire l'aggregazione sul server e trasferire solo un riepilogo nel browser. Ad esempio, consideriamo un browser per file system, vediamo solo la parte superiore dell'albero, quindi emettiamo ulteriori richieste mentre eseguiamo il drill down. Il numero di record restituiti in ciascuna richiesta è relativamente piccolo. Una presentazione con vista ad albero può funzionare bene per grandi serie di risultati.


3
piuttosto stranamente il valore predefinito nel codice (nuovo JavaScriptSerializer ()). MaxJsonLength è 2097152 byte ma il servizio web ResponseFormatJson è 102400 byte se non impostato esplicitamente.
rapina il

2

Mi sono appena imbattuto in questo. Ricevo oltre 6.000 dischi. Ho appena deciso di fare un po 'di paging. Come in, accetto un numero di pagina nel mio endpoint MVC JsonResult, il cui valore predefinito è 0, quindi non è necessario, in questo modo:

public JsonResult MyObjects(int pageNumber = 0)

Quindi invece di dire:

return Json(_repository.MyObjects.ToList(), JsonRequestBehavior.AllowGet);

Dico:

return Json(_repository.MyObjects.OrderBy(obj => obj.ID).Skip(1000 * pageNumber).Take(1000).ToList(), JsonRequestBehavior.AllowGet);

È molto semplice. Quindi, in JavaScript, invece di questo:

function myAJAXCallback(items) {
    // Do stuff here
}

Dico invece:

var pageNumber = 0;
function myAJAXCallback(items) {
    if(items.length == 1000)
        // Call same endpoint but add this to the end: '?pageNumber=' + ++pageNumber
    }
    // Do stuff here
}

E aggiungi i tuoi record a tutto ciò che stavi facendo con loro in primo luogo. O semplicemente aspettare fino a quando tutte le chiamate finiscono e mettere insieme i risultati.


2

Ho risolto il problema aggiungendo questo codice:

String confString = HttpContext.Current.Request.ApplicationPath.ToString();
Configuration conf = WebConfigurationManager.OpenWebConfiguration(confString);
ScriptingJsonSerializationSection section = (ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization");
section.MaxJsonLength = 6553600;
conf.Save();

Sembra una soluzione di hacking ma approccio interessante a prescindere. L'ho trovato utile grazie! Per me nel controller apsnet mvc 5 ho dovuto rimuovere "Current" dallo spazio dei nomi. Ho apportato un paio di aggiustamenti:string confString = HttpContext.Request.ApplicationPath.ToString(); var conf = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(confString); var section = (System.Web.Configuration.ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization"); section.MaxJsonLength = int.MaxValue; conf.Save();
ooXei1sh

2

Correzione alternativa ASP.NET MVC 5:

(Il mio è simile alla risposta MFC sopra con alcune piccole modifiche)

Non ero ancora pronto per passare a Json.NET e nel mio caso l'errore si stava verificando durante la richiesta. Il miglior approccio nel mio scenario era la modifica dell'effettivo JsonValueProviderFactoryche applica la correzione al progetto globale e può essere fatto modificando il global.csfile in quanto tale.

JsonValueProviderConfig.Config(ValueProviderFactories.Factories);

aggiungi una voce web.config:

<add key="aspnet:MaxJsonLength" value="20971520" />

e quindi creare le due seguenti classi

public class JsonValueProviderConfig
{
    public static void Config(ValueProviderFactoryCollection factories)
    {
        var jsonProviderFactory = factories.OfType<JsonValueProviderFactory>().Single();
        factories.Remove(jsonProviderFactory);
        factories.Add(new CustomJsonValueProviderFactory());
    }
}

Questa è fondamentalmente una copia esatta dell'implementazione predefinita trovata in System.Web.Mvcma con l'aggiunta di un valore di settaggio web.config configurabile aspnet:MaxJsonLength.

public class CustomJsonValueProviderFactory : ValueProviderFactory
{

    /// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
    /// <returns>A JSON value-provider object for the specified controller context.</returns>
    /// <param name="controllerContext">The controller context.</param>
    public override IValueProvider GetValueProvider(ControllerContext controllerContext)
    {
        if (controllerContext == null)
            throw new ArgumentNullException("controllerContext");

        object deserializedObject = CustomJsonValueProviderFactory.GetDeserializedObject(controllerContext);
        if (deserializedObject == null)
            return null;

        Dictionary<string, object> strs = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
        CustomJsonValueProviderFactory.AddToBackingStore(new CustomJsonValueProviderFactory.EntryLimitedDictionary(strs), string.Empty, deserializedObject);

        return new DictionaryValueProvider<object>(strs, CultureInfo.CurrentCulture);
    }

    private static object GetDeserializedObject(ControllerContext controllerContext)
    {
        if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
            return null;

        string fullStreamString = (new StreamReader(controllerContext.HttpContext.Request.InputStream)).ReadToEnd();
        if (string.IsNullOrEmpty(fullStreamString))
            return null;

        var serializer = new JavaScriptSerializer()
        {
            MaxJsonLength = CustomJsonValueProviderFactory.GetMaxJsonLength()
        };
        return serializer.DeserializeObject(fullStreamString);
    }

    private static void AddToBackingStore(EntryLimitedDictionary backingStore, string prefix, object value)
    {
        IDictionary<string, object> strs = value as IDictionary<string, object>;
        if (strs != null)
        {
            foreach (KeyValuePair<string, object> keyValuePair in strs)
                CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);

            return;
        }

        IList lists = value as IList;
        if (lists == null)
        {
            backingStore.Add(prefix, value);
            return;
        }

        for (int i = 0; i < lists.Count; i++)
        {
            CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakeArrayKey(prefix, i), lists[i]);
        }
    }

    private class EntryLimitedDictionary
    {
        private static int _maximumDepth;

        private readonly IDictionary<string, object> _innerDictionary;

        private int _itemCount;

        static EntryLimitedDictionary()
        {
            _maximumDepth = CustomJsonValueProviderFactory.GetMaximumDepth();
        }

        public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
        {
            this._innerDictionary = innerDictionary;
        }

        public void Add(string key, object value)
        {
            int num = this._itemCount + 1;
            this._itemCount = num;
            if (num > _maximumDepth)
            {
                throw new InvalidOperationException("The length of the string exceeds the value set on the maxJsonLength property.");
            }
            this._innerDictionary.Add(key, value);
        }
    }

    private static string MakeArrayKey(string prefix, int index)
    {
        return string.Concat(prefix, "[", index.ToString(CultureInfo.InvariantCulture), "]");
    }

    private static string MakePropertyKey(string prefix, string propertyName)
    {
        if (string.IsNullOrEmpty(prefix))
        {
            return propertyName;
        }
        return string.Concat(prefix, ".", propertyName);
    }

    private static int GetMaximumDepth()
    {
        int num;
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
            if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
            {
                return num;
            }
        }
        return 1000;
    }

    private static int GetMaxJsonLength()
    {
        int num;
        NameValueCollection appSettings = ConfigurationManager.AppSettings;
        if (appSettings != null)
        {
            string[] values = appSettings.GetValues("aspnet:MaxJsonLength");
            if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
            {
                return num;
            }
        }
        return 1000;
    }
}

1
Grazie funziona ... Grazie mille @Maxim Gershkovich
Jasper Manickaraj

1

Soluzione per WebForms UpdatePanel:

Aggiungi un'impostazione a Web.config:

<configuration>
  <appSettings>
    <add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
  </appSettings>
</configuration>

https://support.microsoft.com/en-us/kb/981884

ScriptRegistrationManager la classe contiene il seguente codice:

// Serialize the attributes to JSON and write them out
JavaScriptSerializer serializer = new JavaScriptSerializer();

// Dev10# 877767 - Allow configurable UpdatePanel script block length
// The default is JavaScriptSerializer.DefaultMaxJsonLength
if (AppSettings.UpdatePanelMaxScriptLength > 0) {
    serializer.MaxJsonLength = AppSettings.UpdatePanelMaxScriptLength;
}  

string attrText = serializer.Serialize(attrs);

1

Non abbiamo bisogno di modifiche sul lato server. puoi risolvere questo problema solo modificando il file web.config Questo mi ha aiutato. prova questo

<appSettings>
 <add key="aspnet:MaxJsonDeserializerMembers" value="2147483647" />
<add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
</appSettings>  

and   

<system.web.extensions>
<scripting>
  <webServices>
    <jsonSerialization maxJsonLength="2147483647"/>
  </webServices>
</scripting>


0

uso lib\Newtonsoft.Json.dll

public string serializeObj(dynamic json) {        
    return JsonConvert.SerializeObject(json);
}

0

Correzione per ASP.NET MVC: se si desidera risolverlo solo per un'azione specifica che causa il problema, digitare il codice in questo modo:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return Json(someBigObject);
}

puoi cambiare in questo:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return new JsonResult()
    {
        Data = someBigObject,
        JsonRequestBehavior = JsonRequestBehavior.DenyGet,
        MaxJsonLength = int.MaxValue
    };
}

E la funzionalità dovrebbe essere la stessa, puoi semplicemente restituire JSON più grande come risposta.


Spiegazione basata sul codice sorgente ASP.NET MVC: è possibile verificare quale Controller.Jsonmetodo fa nel codice sorgente ASP.NET MVC

protected internal JsonResult Json(object data)
{
    return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}

Sta chiamando un altro Controller.Jsonmetodo:

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}

dove sono passati contentTypee l' contentEncodingoggetto null. Quindi, in sostanza, chiamare return Json(object)nel controller equivale a chiamare return new JsonResult { Data = object, JsonRequestBehavior = sonRequestBehavior.DenyGet }. È possibile utilizzare il secondo modulo e parametrizzare JsonResult.

Quindi cosa succede quando si imposta la MaxJsonLengthproprietà (per impostazione predefinita è null)? Viene passato alla JavaScriptSerializer.MaxJsonLengthproprietà e quindi il JavaScriptSerializer.Serializemetodo si chiama :

JavaScriptSerializer serializer = new JavaScriptSerializer();
if (MaxJsonLength.HasValue)
{
    serializer.MaxJsonLength = MaxJsonLength.Value;
}

if (RecursionLimit.HasValue)
{
    serializer.RecursionLimit = RecursionLimit.Value;
}

response.Write(serializer.Serialize(Data));

E quando non imposti la MaxJsonLenghtproprietà del serializzatore, assume il valore predefinito che è di soli 2 MB.


-2

se questo valore maxJsonLength è un int allora quanto è grande il suo int 32 bit / 64 bit / 16 bit .... voglio solo essere sicuro di quale sia il valore massimo che posso impostare come mio maxJsonLength

<scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>

-4

Non è necessario avere a che fare con web.config È possibile utilizzare la proprietà breve durante il valore di cattura dell'elenco di passaggio Ad esempio dichiarare un modello come

public class BookModel
    {
        public decimal id { get; set; }  // 1 

        public string BN { get; set; } // 2 Book Name

        public string BC { get; set; } // 3 Bar Code Number

        public string BE { get; set; } // 4 Edition Name

        public string BAL { get; set; } // 5 Academic Level

        public string BCAT { get; set; } // 6 Category
}

qui uso proporzioni brevi come BC = codice a barre BE = edizione del libro e così via


Questo non aiuta se la maggior parte dei dati è nei valori delle proprietà
Window
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.