最近迁移一个系统代码,遇上这问题,第二次遇上,记录备用。
解决方法从百度搜来
1,在web.config 上添加配置
<configuration> <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="2147483647"></jsonSerialization> </webServices> </scripting> </system.web.extensions> </configuration>
2,自定义类
public sealed class MyJsonValueProviderFactory : ValueProviderFactory { private class EntryLimitedDictionary { private static int _maximumDepth = GetMaximumDepth(); private readonly IDictionary<string, object> _innerDictionary; private int _itemCount; public EntryLimitedDictionary(IDictionary<string, object> innerDictionary) { this._innerDictionary = innerDictionary; } public void Add(string key, object value) { if (++this._itemCount > _maximumDepth) { throw new InvalidOperationException("MvcResources.JsonValueProviderFactory_RequestTooLarge"); } this._innerDictionary.Add(key, value); } private static int GetMaximumDepth() { ScriptingJsonSerializationSection section = ConfigurationManager.GetSection("system.web.extensions/scripting/webServices/jsonSerialization") as ScriptingJsonSerializationSection; if (section != null) return section.MaxJsonLength; return 10000; } } private static void AddToBackingStore(EntryLimitedDictionary backingStore, string prefix, object value) { IDictionary<string, object> dictionary = value as IDictionary<string, object>; if (dictionary != null) { foreach (KeyValuePair<string, object> current in dictionary) { AddToBackingStore(backingStore, MakePropertyKey(prefix, current.Key), current.Value); } return; } IList<object> list = value as IList<object>; if (list != null) { for (int i = 0; i < list.Count; i++) { AddToBackingStore(backingStore, MakeArrayKey(prefix, i), list[i]); } return; } backingStore.Add(prefix, value); } private static object GetDeserializedObject(ControllerContext controllerContext) { if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) { return null; } StreamReader streamReader = new StreamReader(controllerContext.HttpContext.Request.InputStream); string text = streamReader.ReadToEnd(); if (string.IsNullOrEmpty(text)) { return null; } JavaScriptSerializer javaScriptSerializer = new JavaScriptSerializer(); // 解决这个问题: // 使用 JSON JavaScriptSerializer 序列化或还原序列化期间发生错误。字符串的长度超过在 maxJsonLength 属性上设定的值。 javaScriptSerializer.MaxJsonLength = int.MaxValue; // ---------------------------------------- return javaScriptSerializer.DeserializeObject(text); } public override IValueProvider GetValueProvider(ControllerContext controllerContext) { if (controllerContext == null) { throw new ArgumentNullException("controllerContext"); } object deserializedObject = GetDeserializedObject(controllerContext); if (deserializedObject == null) { return null; } Dictionary<string, object> dictionary = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); EntryLimitedDictionary backingStore = new EntryLimitedDictionary(dictionary); AddToBackingStore(backingStore, string.Empty, deserializedObject); return new DictionaryValueProvider<object>(dictionary, CultureInfo.CurrentCulture); } private static string MakeArrayKey(string prefix, int index) { return prefix + "[" + index.ToString(CultureInfo.InvariantCulture) + "]"; } private static string MakePropertyKey(string prefix, string propertyName) { if (!string.IsNullOrEmpty(prefix)) { return prefix + "." + propertyName; } return propertyName; } }
3,在Global.asax中 ,添加初始化
protected void Application_Start() { ValueProviderFactories.Factories.Remove(ValueProviderFactories.Factories.OfType<JsonValueProviderFactory>().FirstOrDefault()); ValueProviderFactories.Factories.Add(new MyJsonValueProviderFactory()); }