JavaScriptSerializer期间ASP.NET MVC中的MaxJsonLengthexception
在我的一个控制器动作中,我返回一个非常大的JsonResult
来填充网格。
我收到以下InvalidOperationException
exception:
在使用JSON JavaScriptSerializer进行序列化或反序列化时出错。 string的长度超过maxJsonLength属性中设置的值。
不幸的是,将web.config
的maxJsonLength
属性设置为更高的值并不会显示任何效果。
<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生成json
string,则不需要设置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元素