using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Configuration; using System.Globalization; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Web.Configuration; using System.Web.Mvc; using System.Web.Script.Serialization; namespace Gdsi { public sealed class MyJsonValueProviderFactory : ValueProviderFactory { private class EntryLimitedDictionary { private static int _maximumDepth = GetMaximumDepth(); private readonly IDictionary _innerDictionary; private int _itemCount; public EntryLimitedDictionary(IDictionary 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 dictionary = value as IDictionary; if (dictionary != null) { foreach (KeyValuePair current in dictionary) { AddToBackingStore(backingStore, MakePropertyKey(prefix, current.Key), current.Value); } return; } IList list = value as IList; 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 System.Web.Mvc.IValueProvider GetValueProvider(ControllerContext controllerContext) { if (controllerContext == null) { throw new ArgumentNullException("controllerContext"); } object deserializedObject = GetDeserializedObject(controllerContext); if (deserializedObject == null) { return null; } Dictionary dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); EntryLimitedDictionary backingStore = new EntryLimitedDictionary(dictionary); AddToBackingStore(backingStore, string.Empty, deserializedObject); return new DictionaryValueProvider(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; } } }