2012-06-10 21 views
166

sto ottenendo questo errore:Ottenere "La richiesta JSON era troppo grande per essere deserializzati"

The JSON request was too large to be deserialized.

Ecco uno scenario in cui ciò si verifica. Ho una classe di paese che in possesso di un elenco di porte di spedizione di quel paese

public class Country 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public List<Port> Ports { get; set; } 
} 

Io uso KnockoutJS sul lato client per fare un bassi cascata goccia. Quindi abbiamo una serie di due elenchi a discesa, in cui il primo è il paese e il secondo è il porto di quel paese.

Tutto sta funzionando bene finora, questo mio script lato client:

var k1 = k1 || {}; 
$(document).ready(function() { 

    k1.MarketInfoItem = function (removeable) { 
     var self = this; 
     self.CountryOfLoadingId = ko.observable(); 
     self.PortOfLoadingId = ko.observable(); 
     self.CountryOfDestinationId = ko.observable(); 
     self.PortOfDestinationId = ko.observable(); 
    }; 

    k1.viewModel = function() { 
     var marketInfoItems = ko.observableArray([]), 
      countries = ko.observableArray([]), 

      saveMarketInfo = function() { 
       var jsonData = ko.toJSON(marketInfoItems); 
       $.ajax({ 
        url: 'SaveMarketInfos', 
        type: "POST", 
        data: jsonData, 
        datatype: "json", 
        contentType: "application/json charset=utf-8", 
        success: function (data) { 
         if (data) { 
          window.location.href = "Fin"; 
         } else { 
          alert("Can not save your market information now!"); 
         } 

        }, 
        error: function (data) { alert("Can not save your contacts now!"); } 
       }); 
      }, 

      loadData = function() { 
       $.getJSON('../api/ListService/GetCountriesWithPorts', function (data) { 
        countries(data); 
       }); 
      }; 
     return { 
      MarketInfoItems: marketInfoItems, 
      Countries: countries, 
      LoadData: loadData, 
      SaveMarketInfo: saveMarketInfo, 
     }; 
    }(); 

Il problema si verifica quando viene selezionato un paese come la Cina, che ha un sacco di porte. Quindi se hai 3 o 4 volte "Cina" nel tuo array e voglio inviarlo al server per salvare. L'errore si verifica

Cosa devo fare per porre rimedio a questo?

+3

Per chiunque sia curioso del motivo per cui ciò accade o per scrivere il serializzatore del cliente: dare un'occhiata a [codice sorgente di JsonValueProviderFactory.cs] (https://github.com/mono/aspnetwebstack/blob/master/src/System.Web. Mvc/JsonValueProviderFactory.cs # L118) - sembra che il team ASP.NET MVC metta intenzionalmente il limite a 1000. – kape123

risposta

329

È necessario regolare la proprietà maxJsonLength su un valore superiore in web.config per risolvere il problema.

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

Impostare un valore più alto per aspnet:MaxJsonDeserializerMembers nelle appSettings:

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

Se queste opzioni non funzionano si potrebbe provare a creare una fabbrica di fornitore di valore JSON personalizzato utilizzando JSON. NET come specificato in questo thread.

+53

Stavo lavorando a un'applicazione MVC4 che serializzava un grande volume (1k +) di oggetti json su un controller. Il metodo system.web.extensions non ha fatto nulla, ma l'appSettings era la soluzione magica. Grazie! – TNCodeMonkey

+3

'aspnet: MaxJsonDeserializerMembers' ha funzionato anche per me. Qualcuno sa dove questo è effettivamente documentato? –

+1

Il collegamento MSDN è danneggiato. Il collegamento corretto è http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.maxjsonlength.aspx –

Problemi correlati