2012-06-10 29 views
166

que estoy recibiendo este error:consiguiendo "La solicitud JSON era demasiado grande para ser deserializado"

The JSON request was too large to be deserialized.

Aquí es un escenario donde esto ocurre. Tengo una clase de país que mantenga una lista de puertos de embarque de ese país

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

utilizo KnockoutJS en el lado del cliente para hacer unos menús desplegables en cascada. Así que tenemos una variedad de dos menús desplegables, donde el primero es el país y el segundo es los puertos de ese país.

Todo está funcionando muy bien hasta ahora, ésta es mi script del lado del cliente:

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, 
     }; 
    }(); 

El problema se produce cuando se selecciona un país como China, que tiene un montón de los puertos. Entonces, si tienes 3 o 4 veces "China" en tu matriz y quiero enviarlo al servidor para guardarlo. El error ocurre

¿Qué debo hacer para remediar esto?

+3

Para cualquiera que tenga curiosidad por saber por qué sucede esto o escriba su serializador de clientes, eche un vistazo al [código fuente de JsonValueProviderFactory.cs] (https://github.com/mono/aspnetwebstack/blob/master/src/System.Web. Mvc/JsonValueProviderFactory.cs # L118) - parece que el equipo de ASP.NET MVC puso intencionadamente el límite en 1000. – kape123

Respuesta

329

Tienes que ajustar la propiedad maxJsonLength a un valor superior en web.config para resolver el problema.

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

Ajuste un valor más alto para aspnet:MaxJsonDeserializerMembers en los appsettings:

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

Si estas opciones no están funcionando podría intentar crear una fábrica de proveedor de valores JSON personalizado utilizando JSON. NET como se especifica en este thread.

+53

Estaba trabajando en una aplicación MVC4 que estaba serializando un gran volumen (1k +) de objetos json en un controlador. El método system.web.extensions no hizo nada, pero appSettings fue la solución mágica. ¡Gracias! – TNCodeMonkey

+3

'aspnet: MaxJsonDeserializerMembers' también funcionó para mí. ¿Alguien sabe dónde está esto realmente documentado? –

+1

El enlace de MSDN está roto. El enlace correcto es http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.maxjsonlength.aspx –

Cuestiones relacionadas