JsonValueProviderFactory lanza “solicitud demasiado grande”

Recibo una excepción que la solicitud JSON era demasiado grande para deserializarla.

Viene de JsonValueProviderFactory ….

La aplicación MVC actualmente tiene un archivador de modelo personalizado que usa Json.Net que no tiene problemas para deserializar los datos json. Sin embargo, supongo que el proveedor de valores JSON predeterminado se está tropezando. o tiene algún límite raro incorporado?

Puede ser que tenga que ver con la última versión de MVC4 ya que al usar la versión anterior de MVC4 no hubo problemas con grandes cantidades de JSON.

Entonces, ¿hay alguna manera de cambiar las configuraciones del encuadernador de valores json?

pasando por http://haacked.com/archive/2011/06/30/whatrsquos-the-difference-between-a-value-provider-and-model-binder.aspx

Me da la impresión de que es algo personalizado lo que lo convierte en un diccionario … ¿No puedo encontrar ningún código fuente relacionado con él o si hay alguna configuración que pueda cambiar?

¿O hay una ValueBinder alternativa que podría usar?

o alguna otra opción?

Server Error in '/' Application. The JSON request was too large to be deserialized. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.InvalidOperationException: The JSON request was too large to be deserialized. Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. Stack Trace: [InvalidOperationException: The JSON request was too large to be deserialized.] System.Web.Mvc.EntryLimitedDictionary.Add(String key, Object value) +464621 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +413 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +164 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +164 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +373 System.Web.Mvc.JsonValueProviderFactory.AddToBackingStore(EntryLimitedDictionary backingStore, String prefix, Object value) +164 System.Web.Mvc.JsonValueProviderFactory.GetValueProvider(ControllerContext controllerContext) +116 System.Web.Mvc.c__DisplayClassc.b__7(ValueProviderFactory factory) +34 System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +151 System.Linq.WhereSelectEnumerableIterator`2.MoveNext() +177 

Si usa JSON.NET para la serialización / deserialización, puede sustituir el JsonValueProviderFactory predeterminado por uno personalizado como se muestra en esta publicación del blog :

 public sealed class JsonDotNetValueProviderFactory : ValueProviderFactory { public override IValueProvider GetValueProvider(ControllerContext controllerContext) { if (controllerContext == null) throw new ArgumentNullException("controllerContext"); if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) return null; var reader = new StreamReader(controllerContext.HttpContext.Request.InputStream); var bodyText = reader.ReadToEnd(); return String.IsNullOrEmpty(bodyText) ? null : new DictionaryValueProvider(JsonConvert.DeserializeObject(bodyText, new ExpandoObjectConverter()) , CultureInfo.CurrentCulture); } } 

y en su Application_Start :

 ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType().FirstOrDefault()); ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory()); 

y si quiere seguir con la fábrica predeterminada que utiliza la clase JavaScriptSerializer , puede ajustar la propiedad maxJsonLength en su web.config:

        

Para mí, maxJsonLength no se excedió. Tuve que agregar lo siguiente:

    

Funcionó un placer después de eso.

Las sugerencias anteriores no funcionaron para mí hasta que intenté esto:

 // Global.asax.cs protected void Application_Start() { MiniProfiler.Settings.MaxJsonResponseSize = int.MaxValue; }