8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

我可以在 web.config 中为 maxJsonLength 设置无限长度吗?

Rytmis 1月前

94 0

我正在使用 jQuery 的自动完成功能。当我尝试检索超过 17000 条记录的列表(每条记录的长度不超过 10 个字符)时,它超出了长度并引发错误:...

我正在使用 jQuery 的自动完成功能。当我尝试检索超过 17000 条记录的列表(每条记录的长度不超过 10 个字符)时,它超出了长度并引发错误:

异常信息:
异常类型:InvalidOperationException
异常消息:使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错。字符串的长度超出了 maxJsonLength 属性上设置的值。

设置无限长度吗 maxJsonLength in web.config ?如果不行,我可以设置的最大长度是多少?

帖子版权声明 1、本帖标题:我可以在 web.config 中为 maxJsonLength 设置无限长度吗?
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Rytmis在本站《image》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 即使使用 maxJsonLength=\'2147483647\',我仍然收到错误。

    我已经用下面的方法解决了这个问题,也许对你有帮助。而不是序列化一个完整的数组

    return new JavaScriptSerializer().Serialize( ...full.array.here... )
    

    我序列化数组的每个元素

    string[] arrayWithSerializedItems = ...;
    return "[" + string.Join("," + arrayWithSerializedItems) + "]";
    
  • 使用 lib\Newtonsoft.Json.dll

    public string serializeObj(dynamic json) {        
        return JsonConvert.SerializeObject(json);
    }
    
  • 我使用这个并且它适用于 Kendo 网格读取请求。

    { 
      //something
       var result = XResult.ToList().ToDataSourceResult(request);
       var rs = Json(result, JsonRequestBehavior.AllowGet);
       rs.MaxJsonLength = int.MaxValue;
       return rs;
    }
    
  • WebForms UpdatePanel 的解决方案:

    向 Web.config 添加设置:

    <configuration>
      <appSettings>
        <add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
      </appSettings>
    </configuration>
    

    https://support.microsoft.com/en-us/kb/981884

    ScriptRegistrationManager 类包含以下代码:

    // Serialize the attributes to JSON and write them out
    JavaScriptSerializer serializer = new JavaScriptSerializer();
    
    // Dev10# 877767 - Allow configurable UpdatePanel script block length
    // The default is JavaScriptSerializer.DefaultMaxJsonLength
    if (AppSettings.UpdatePanelMaxScriptLength > 0) {
        serializer.MaxJsonLength = AppSettings.UpdatePanelMaxScriptLength;
    }  
    
    string attrText = serializer.Serialize(attrs);
    
  • 我们不需要任何服务器端更改。 你可以只通过修改 web.config 文件来解决这个问题 。这对我很有帮助。试试这个

    <appSettings>
     <add key="aspnet:MaxJsonDeserializerMembers" value="2147483647" />
    <add key="aspnet:UpdatePanelMaxScriptLength" value="2147483647" />
    </appSettings>  
    
    and   
    
    <system.web.extensions>
    <scripting>
      <webServices>
        <jsonSerialization maxJsonLength="2147483647"/>
      </webServices>
    </scripting>
    

  • 这似乎是一个黑客式的解决方案,但无论如何都是一种有趣的方法。我觉得它很有用,谢谢!对我来说,在 apsnet mvc 5 控制器中,我必须从命名空间中删除“当前”。我做了一些调整:string confString = HttpContext.Request.ApplicationPath.ToString(); var conf = System.Web.Configuration.WebConfigurationManager.OpenWebConfiguration(confString); var section = (System.Web.Configuration.ScriptingJsonSerializationSection)conf.GetSection(\'system.web.extensions/scripting/webServices/jsonSerialization\'); section.MaxJsonLength = int.MaxValue; conf.Save();

  • 我通过添加以下代码解决了该问题:

    String confString = HttpContext.Current.Request.ApplicationPath.ToString();
    Configuration conf = WebConfigurationManager.OpenWebConfiguration(confString);
    ScriptingJsonSerializationSection section = (ScriptingJsonSerializationSection)conf.GetSection("system.web.extensions/scripting/webServices/jsonSerialization");
    section.MaxJsonLength = 6553600;
    conf.Save();
    
  • 刚刚遇到这个问题。我收到了超过 6,000 条记录。我决定只做一些分页。例如,我在 MVC JsonResult 端点中接受页码,该页码默认为 0,因此没有必要,如下所示:

    public JsonResult MyObjects(int pageNumber = 0)
    

    那么不要说:

    return Json(_repository.MyObjects.ToList(), JsonRequestBehavior.AllowGet);
    

    我说:

    return Json(_repository.MyObjects.OrderBy(obj => obj.ID).Skip(1000 * pageNumber).Take(1000).ToList(), JsonRequestBehavior.AllowGet);
    

    这很简单。然后,在 JavaScript 中,改为:

    function myAJAXCallback(items) {
        // Do stuff here
    }
    

    我反而会说:

    var pageNumber = 0;
    function myAJAXCallback(items) {
        if(items.length == 1000)
            // Call same endpoint but add this to the end: '?pageNumber=' + ++pageNumber
        }
        // Do stuff here
    }
    

    然后将记录附加到您最初对它们进行的操作中。或者等到所有调用完成后再将结果拼凑在一起。

  • 相当奇怪的是,代码 (new JavaScriptSerializer()).MaxJsonLength 中的默认值为 2097152 字节,但除非明确设置,否则 Web 服务 ResponseFormatJson 为 102400 字节。

  • 似乎没有“无限制”值。默认值为 2097152 个字符,相当于 4 MB 的 Unicode 字符串数据。

    正如已经观察到的那样,17,000 条记录很难在浏览器中很好地使用。如果您要呈现聚合视图,则在服务器上进行聚合并仅在浏览器中传输摘要可能会更有效。例如,考虑一个文件系统浏览器,我们只看到树的顶部,然后在向下钻取时发出进一步的请求。每个请求中返回的记录数相对较少。树视图呈现可以很好地用于大型结果集。

  •  JsonResult result = Json(r);
     result.MaxJsonLength = Int32.MaxValue;
     result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
     return result;
    
  • 您可以像其他人所说的那样在配置中设置它,也可以在序列化器的单个实例上进行设置,例如:

    var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };
    
  • 不久前遇到同样的问题后,我选择为自动完成功能实现一个“onsearch”处理程序,并让 Web 服务调用传递“search”文本并使用搜索条件作为过滤器执行 Top10 查询。这意味着更多的单个 Ajax 请求,而不仅仅是在页面加载时获取完整列表,但这也意味着所有请求/响应都小得多。

  • 引用 15

    您可以结合使用服务器和客户端过滤。在客户端过滤所有数据可能很困难,更不用说网络延迟了。

  • 引用 16

    json 的默认列表将提供 17k 条记录。但自动完成功能将仅列出与用户键入的字符匹配的记录,因此不需要进一步滚动列表。所以我需要为 maxJsonLength 设置无限长度,以便可以序列化 17k 数据。

  • 真正的问题是您是否真的需要返回 17k 条记录?您打算如何处理浏览器中的所有数据?无论如何,用户不会滚动浏览 17000 行。

    更好的方法是仅检索“前几条”记录并根据需要加载更多记录。

  • 对于那些在 MVC3 中遇到 JSON 自动反序列化用于模型绑定且太大的问题的人来说,这里有一个解决方案。

    1. 将 JsonValueProviderFactory 类的代码从 MVC3 源代码复制到新类中。
    2. 添加一行来更改对象反序列化之前的最大 JSON 长度。
    3. 将 JsonValueProviderFactory 类替换为新的、修改后的类。

    感谢 http://blog.naver.com/techshare/100145191355 https://gist.github.com/DalSoft/1588818 为我指明了正确的方向。第一个网站上的最后一个链接包含解决方案的完整源代码。

  • 替代的 ASP.NET MVC 5 修复:

    (我的答案与上面 MFC 的答案类似,但有一些小改动)

    我还没有准备好改用 Json.NET,而我的情况是请求期间发生了错误。在我的场景中,最好的方法是修改实际情况 JsonValueProviderFactory ,将修复应用于全局项目,可以通过编辑文件 global.cs 来完成。

    JsonValueProviderConfig.Config(ValueProviderFactories.Factories);
    

    添加 web.config 条目:

    <add key="aspnet:MaxJsonLength" value="20971520" />
    

    然后创建以下两个类

    public class JsonValueProviderConfig
    {
        public static void Config(ValueProviderFactoryCollection factories)
        {
            var jsonProviderFactory = factories.OfType<JsonValueProviderFactory>().Single();
            factories.Remove(jsonProviderFactory);
            factories.Add(new CustomJsonValueProviderFactory());
        }
    }
    

    这基本上是默认实现的精确副本, System.Web.Mvc 但增加了可配置的 web.config appsetting 值 aspnet:MaxJsonLength .

    public class CustomJsonValueProviderFactory : ValueProviderFactory
    {
    
        /// <summary>Returns a JSON value-provider object for the specified controller context.</summary>
        /// <returns>A JSON value-provider object for the specified controller context.</returns>
        /// <param name="controllerContext">The controller context.</param>
        public override IValueProvider GetValueProvider(ControllerContext controllerContext)
        {
            if (controllerContext == null)
                throw new ArgumentNullException("controllerContext");
    
            object deserializedObject = CustomJsonValueProviderFactory.GetDeserializedObject(controllerContext);
            if (deserializedObject == null)
                return null;
    
            Dictionary<string, object> strs = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase);
            CustomJsonValueProviderFactory.AddToBackingStore(new CustomJsonValueProviderFactory.EntryLimitedDictionary(strs), string.Empty, deserializedObject);
    
            return new DictionaryValueProvider<object>(strs, CultureInfo.CurrentCulture);
        }
    
        private static object GetDeserializedObject(ControllerContext controllerContext)
        {
            if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase))
                return null;
    
            string fullStreamString = (new StreamReader(controllerContext.HttpContext.Request.InputStream)).ReadToEnd();
            if (string.IsNullOrEmpty(fullStreamString))
                return null;
    
            var serializer = new JavaScriptSerializer()
            {
                MaxJsonLength = CustomJsonValueProviderFactory.GetMaxJsonLength()
            };
            return serializer.DeserializeObject(fullStreamString);
        }
    
        private static void AddToBackingStore(EntryLimitedDictionary backingStore, string prefix, object value)
        {
            IDictionary<string, object> strs = value as IDictionary<string, object>;
            if (strs != null)
            {
                foreach (KeyValuePair<string, object> keyValuePair in strs)
                    CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value);
    
                return;
            }
    
            IList lists = value as IList;
            if (lists == null)
            {
                backingStore.Add(prefix, value);
                return;
            }
    
            for (int i = 0; i < lists.Count; i++)
            {
                CustomJsonValueProviderFactory.AddToBackingStore(backingStore, CustomJsonValueProviderFactory.MakeArrayKey(prefix, i), lists[i]);
            }
        }
    
        private class EntryLimitedDictionary
        {
            private static int _maximumDepth;
    
            private readonly IDictionary<string, object> _innerDictionary;
    
            private int _itemCount;
    
            static EntryLimitedDictionary()
            {
                _maximumDepth = CustomJsonValueProviderFactory.GetMaximumDepth();
            }
    
            public EntryLimitedDictionary(IDictionary<string, object> innerDictionary)
            {
                this._innerDictionary = innerDictionary;
            }
    
            public void Add(string key, object value)
            {
                int num = this._itemCount + 1;
                this._itemCount = num;
                if (num > _maximumDepth)
                {
                    throw new InvalidOperationException("The length of the string exceeds the value set on the maxJsonLength property.");
                }
                this._innerDictionary.Add(key, value);
            }
        }
    
        private static string MakeArrayKey(string prefix, int index)
        {
            return string.Concat(prefix, "[", index.ToString(CultureInfo.InvariantCulture), "]");
        }
    
        private static string MakePropertyKey(string prefix, string propertyName)
        {
            if (string.IsNullOrEmpty(prefix))
            {
                return propertyName;
            }
            return string.Concat(prefix, ".", propertyName);
        }
    
        private static int GetMaximumDepth()
        {
            int num;
            NameValueCollection appSettings = ConfigurationManager.AppSettings;
            if (appSettings != null)
            {
                string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers");
                if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
                {
                    return num;
                }
            }
            return 1000;
        }
    
        private static int GetMaxJsonLength()
        {
            int num;
            NameValueCollection appSettings = ConfigurationManager.AppSettings;
            if (appSettings != null)
            {
                string[] values = appSettings.GetValues("aspnet:MaxJsonLength");
                if (values != null && values.Length != 0 && int.TryParse(values[0], out num))
                {
                    return num;
                }
            }
            return 1000;
        }
    }
    
  • 如果您在 View 中遇到此类问题,可以使用以下方法解决。这里我使用了 Newtonsoft 包。

    @using Newtonsoft.Json
    <script type="text/javascript">
        var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
    </script>
    
返回
作者最近主题: