JavaScriptSerializer期间ASP.NET MVC中的MaxJsonLengthexception

在我的一个控制器动作中,我返回一个非常大的JsonResult来填充网格。

我收到以下InvalidOperationExceptionexception:

在使用JSON JavaScriptSerializer进行序列化或反序列化时出错。 string的长度超过maxJsonLength属性中设置的值。

不幸的是,将web.configmaxJsonLength属性设置为更高的值并不会显示任何效果。

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

我不想把它作为一个string,就像在这个答案中提到的那样。

在我的研究中,我遇到了这个博客文章,写一个自己的ActionResult (例如LargeJsonResult : JsonResult )被推荐来绕过这个行为。

这是唯一的解决scheme吗?
这是ASP.NET MVC中的错误?
我错过了什么吗?

任何帮助将不胜感激。

看来这已经在MVC4中修复了。

你可以做到这一点,这对我来说很好:

 public ActionResult SomeControllerAction() { var jsonResult = Json(veryLargeCollection, JsonRequestBehavior.AllowGet); jsonResult.MaxJsonLength = int.MaxValue; return jsonResult; } 

您也可以像这里build议的那样使用ContentResult而不是子类化JsonResult

 var serializer = new JavaScriptSerializer { MaxJsonLength = Int32.MaxValue, RecursionLimit = 100 }; return new ContentResult() { Content = serializer.Serialize(data), ContentType = "application/json", }; 

不幸的是,web.config设置被默认的JsonResult实现忽略 。 所以我想你会需要实现一个自定义json结果来克服这个问题。

不需要自定义类。 这是所需要的一切:

 return new JsonResult { Data = Result, MaxJsonLength = Int32.MaxValue }; 

其中Result是你想要序列化的数据。

如果使用Json.NET生成jsonstring,则不需要设置MaxJsonLength值。

 return new ContentResult() { Content = Newtonsoft.Json.JsonConvert.SerializeObject(data), ContentType = "application/json", }; 

你可以尝试在你的LINQexpression式中只定义你需要的字段。

例。 想象一下,你有一个模型与Id,名称,电话和图片(字节数组),并需要从JSON加载到select列表。

LINQ查询:

 var listItems = (from u in Users where u.name.Contains(term) select u).ToList(); 

这里的问题是“ select你 ”,得到所有的领域。 所以,如果你有大的照片,booomm。

如何解决? 非常,非常简单。

 var listItems = (from u in Users where u.name.Contains(term) select new {u.Id, u.Name}).ToList(); 

最佳做法是只select您将使用的字段。

记得。 这是一个简单的提示,但可以帮助许多ASP.NET MVC开发人员。

我通过下面的 链接 解决了这个问题

 namespace System.Web.Mvc { 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<object>(JsonConvert.DeserializeObject<ExpandoObject>(bodyText, new ExpandoObjectConverter()), CultureInfo.CurrentCulture); } } } protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RegisterGlobalFilters(GlobalFilters.Filters); RegisterRoutes(RouteTable.Routes); //Remove and JsonValueProviderFactory and add JsonDotNetValueProviderFactory ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault()); ValueProviderFactories.Factories.Add(new JsonDotNetValueProviderFactory()); } 

您需要在代码返回JsonResult对象之前手动从configuration部分读取数据。 只需从web.config中单行读取:

  var jsonResult = Json(resultsForAjaxUI); jsonResult.MaxJsonLength = (ConfigurationManager.GetSection("system.web.extensions/scripting/webServices/jsonSerialization") as System.Web.Configuration.ScriptingJsonSerializationSection).MaxJsonLength; return jsonResult; 

确保你在web.config中定义了configuration元素