• 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());
    
            }
  • 相关阅读:
    c# 类中使用ResolveUrl
    IIS7日志中时间与系统时间不一致的原因
    IIS日志-网站运维的好帮手
    精通 JS正则表达式
    word 标题序号
    rtx 二次开发,查找所有部门
    【云计算】Docker容器时间同步如何配置?
    【云计算】Docker多进程管理方案-cfengine && supervisord
    【Python】装饰器实现日志记录
    【云计算】k8s相关资料
  • 原文地址:https://www.cnblogs.com/Qiozi/p/9689998.html
Copyright © 2020-2023  润新知