zoukankan      html  css  js  c++  java
  • json 请求太大,无法反序列化

    最近迁移一个系统代码,遇上这问题,第二次遇上,记录备用。

    解决方法从百度搜来

    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());
    
            }
  • 相关阅读:
    [Hapi.js] Route parameters
    [Hapi.js] Logging with good and good-console
    [Hapi.js] Up and running
    [Unit Testing] Directive testing, require parent controller
    数学-盲点题:九个点用四条直线连起来
    汉语-词语-思维:思维方法
    汉语-词语-思维:思维方式
    汉语-词语:思维
    思考方式-数学-盲点题:盲点题
    摄像机-哈苏:哈苏
  • 原文地址:https://www.cnblogs.com/Qiozi/p/9689998.html
Copyright © 2011-2022 走看看