Могу ли я установить неограниченную длину для maxJsonLength в интернете.конфиг?
Я использую функцию автозаполнения jQuery. Когда я пытаюсь получить список из более чем 17000 записей (каждая не будет иметь более 10 символов длины), он превышает длину и выдает ошибку:
сведения об исключении:
Тип исключения: исключение InvalidOperationException
Сообщение об исключении: ошибка при сериализации или десериализации с помощью JSON JavaScriptSerializer. Длина строки превышает значение, установленное на собственность maxJsonLength.
могу ли я установить неограниченную длину для maxJsonLength на web.config? Если нет, то какова максимальная длина, которую я могу установить?
27 ответов:
Примечание: этот ответ применяется только к веб-службам, если вы возвращаете JSON из метода контроллера, убедитесь, что вы прочитали этот ответ SO ниже:https://stackoverflow.com/a/7207539/1246870
на MaxJsonLength свойство не может быть неограниченным, является целочисленным свойством, которое по умолчанию равно 102400 (100k).
вы можете установить свойство MaxJsonLength в вашем интернете.config:
<configuration> <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="50000000"/> </webServices> </scripting> </system.web.extensions> </configuration>
если вы используете MVC 4, будьте уверены, чтобы проверить ответ как хорошо.
если вы все еще получаете ошибку:
- после установки
maxJsonLengthсвойство с максимальным значением в web.конфигурации- и вы знаете, что длина ваших данных меньше, чем это значение
- и вы не используете метод веб-службы для JavaScript сериализация
ваша проблема, скорее всего, что:
значение свойства MaxJsonLength применяется только к внутреннему экземпляру JavaScriptSerializer, который используется уровнем асинхронной связи для вызова методов веб-служб. (MSDN: ScriptingJsonSerializationSection.MaxJsonLength Собственность)
в основном "внутренние"
JavaScriptSerializerуважает стоимостьюmaxJsonLengthпри вызове из веб-метод; прямое использованиеJavaScriptSerializer(или использовать через MVC action-method/Controller) делает не уважаюmaxJsonLengthсобственность, по крайней мере, не из веб.конфиг.в качестве обходного пути, вы можете сделать следующее в ваш контроллер (или в любом месте на самом деле):
var serializer = new JavaScriptSerializer(); // For simplicity just use Int32's max value. // You could always read the value from the config section mentioned above. serializer.MaxJsonLength = Int32.MaxValue; var resultData = new { Value = "foo", Text = "var" }; var result = new ContentResult{ Content = serializer.Serialize(resultData), ContentType = "application/json" }; return result;
этот ответ-моя интерпретация это asp.net форум ответ.
в MVC 4 Вы можете сделать:
protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior) { return new JsonResult() { Data = data, ContentType = contentType, ContentEncoding = contentEncoding, JsonRequestBehavior = behavior, MaxJsonLength = Int32.MaxValue }; }в ваш контроллер.
дополнение:
для тех, кто озадачен параметрами, которые необходимо указать, вызов может выглядеть следующим образом:
Json( new { field1 = true, field2 = "value" }, "application/json", Encoding.UTF8, JsonRequestBehavior.AllowGet );
вы можете настроить максимальную длину для запросов json в вашем интернете.конфигурационный файл:
<configuration> <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="...."> </jsonSerialization> </webServices> </scripting> </system.web.extensions> </configuration>значение по умолчанию для maxJsonLength -102400. Для получения более подробной информации, см. На следующей странице MSDN: http://msdn.microsoft.com/en-us/library/bb763183.aspx
У меня была эта проблема в ASP.NET веб-формы. Он полностью игнорировал паутину.настройки файла конфигурации, поэтому я сделал это:
JavaScriptSerializer serializer = new JavaScriptSerializer(); serializer.MaxJsonLength = Int32.MaxValue; return serializer.Serialize(response);конечно, в целом это ужасная практика. Если вы отправляете данные через вызов веб-службы, вы должны посмотреть на другой подход.
Если вы все еще получаете сообщение об ошибке после веб.настройка конфигурации, как показано ниже:
<configuration> <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="50000000"/> </webServices> </scripting> </system.web.extensions> </configuration>Я решил ее следующим образом:
public ActionResult/JsonResult getData() { var jsonResult = Json(superlargedata, JsonRequestBehavior.AllowGet); jsonResult.MaxJsonLength = int.MaxValue; return jsonResult; }Я надеюсь, что это должно помочь.
Я все исправила.
//your Json data here string json_object="........"; JavaScriptSerializer jsJson = new JavaScriptSerializer(); jsJson.MaxJsonLength = 2147483644; MyClass obj = jsJson.Deserialize<MyClass>(json_object);он работает очень хорошо.
Если после реализации вышеуказанного добавления в ваш веб.config, вы получаете "нераспознанный раздел конфигурации.сеть.увеличение."ошибка затем попробуйте добавить это в свой веб.конфигурация в :
<sectionGroup name="system.web.extensions" type="System.Web.Extensions"> <sectionGroup name="scripting" type="System.Web.Extensions"> <sectionGroup name="webServices" type="System.Web.Extensions"> <section name="jsonSerialization" type="System.Web.Extensions"/> </sectionGroup> </sectionGroup> </sectionGroup>
я последовал за ответ выстригает и дошел до этого решения:
когда мне нужно было опубликовать большой json для действия в контроллере, я бы получил знаменитую "ошибку во время десериализации с помощью JSON JavaScriptSerializer. Длина строки превышает значение, установленное для свойства maxJsonLength.\r\nParameter имя: поставщик входных значений".
то, что я сделал, это создать новый ValueProviderFactory, LargeJsonValueProviderFactory и установить MaxJsonLength = Int32.Максвеллову в методе GetDeserializedObject
public sealed class LargeJsonValueProviderFactory : ValueProviderFactory { private static void AddToBackingStore(LargeJsonValueProviderFactory.EntryLimitedDictionary backingStore, string prefix, object value) { IDictionary<string, object> dictionary = value as IDictionary<string, object>; if (dictionary != null) { foreach (KeyValuePair<string, object> keyValuePair in (IEnumerable<KeyValuePair<string, object>>) dictionary) LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakePropertyKey(prefix, keyValuePair.Key), keyValuePair.Value); } else { IList list = value as IList; if (list != null) { for (int index = 0; index < list.Count; ++index) LargeJsonValueProviderFactory.AddToBackingStore(backingStore, LargeJsonValueProviderFactory.MakeArrayKey(prefix, index), list[index]); } else backingStore.Add(prefix, value); } } private static object GetDeserializedObject(ControllerContext controllerContext) { if (!controllerContext.HttpContext.Request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) return (object) null; string end = new StreamReader(controllerContext.HttpContext.Request.InputStream).ReadToEnd(); if (string.IsNullOrEmpty(end)) return (object) null; var serializer = new JavaScriptSerializer {MaxJsonLength = Int32.MaxValue}; return serializer.DeserializeObject(end); } /// <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 = LargeJsonValueProviderFactory.GetDeserializedObject(controllerContext); if (deserializedObject == null) return (IValueProvider) null; Dictionary<string, object> dictionary = new Dictionary<string, object>((IEqualityComparer<string>) StringComparer.OrdinalIgnoreCase); LargeJsonValueProviderFactory.AddToBackingStore(new LargeJsonValueProviderFactory.EntryLimitedDictionary((IDictionary<string, object>) dictionary), string.Empty, deserializedObject); return (IValueProvider) new DictionaryValueProvider<object>((IDictionary<string, object>) dictionary, CultureInfo.CurrentCulture); } private static string MakeArrayKey(string prefix, int index) { return prefix + "[" + index.ToString((IFormatProvider) CultureInfo.InvariantCulture) + "]"; } private static string MakePropertyKey(string prefix, string propertyName) { if (!string.IsNullOrEmpty(prefix)) return prefix + "." + propertyName; return propertyName; } private class EntryLimitedDictionary { private static int _maximumDepth = LargeJsonValueProviderFactory.EntryLimitedDictionary.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 > LargeJsonValueProviderFactory.EntryLimitedDictionary._maximumDepth) throw new InvalidOperationException("JsonValueProviderFactory_RequestTooLarge"); this._innerDictionary.Add(key, value); } private static int GetMaximumDepth() { NameValueCollection appSettings = ConfigurationManager.AppSettings; if (appSettings != null) { string[] values = appSettings.GetValues("aspnet:MaxJsonDeserializerMembers"); int result; if (values != null && values.Length > 0 && int.TryParse(values[0], out result)) return result; } return 1000; } }}
затем, в методе Application_Start в Global.асакс.cs, замените ValueProviderFactory на новый:
protected void Application_Start() { ... //Add LargeJsonValueProviderFactory ValueProviderFactory jsonFactory = null; foreach (var factory in ValueProviderFactories.Factories) { if (factory.GetType().FullName == "System.Web.Mvc.JsonValueProviderFactory") { jsonFactory = factory; break; } } if (jsonFactory != null) { ValueProviderFactories.Factories.Remove(jsonFactory); } var largeJsonValueProviderFactory = new LargeJsonValueProviderFactory(); ValueProviderFactories.Factories.Add(largeJsonValueProviderFactory); }
вы можете записать эту строку в контроллер
json.MaxJsonLength = 2147483644;вы также можете записать эту строку в
web.config<configuration> <system.web.extensions> <scripting> <webServices> <jsonSerialization maxJsonLength="2147483647"> </jsonSerialization> </webServices> </scripting> </system.web.extensions>'
чтобы быть в безопасности, используйте оба.
Если вы получаете эту ошибку из MiniProfiler в MVC, то вы можете увеличить значение, установив свойство
MiniProfiler.Settings.MaxJsonResponseSizeдо нужного значения. По умолчанию, этот инструмент, кажется, игнорируют значения, установленного в конфигурации.MiniProfiler.Settings.MaxJsonResponseSize = 104857600;вежливость mvc-mini-profiler.
просто установите MaxJsonLength proprty в методе действия MVC
JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet); json.MaxJsonLength = int.MaxValue; return json;
Я предлагаю установить его в Int32.Максвелл.
JavaScriptSerializer serializer = new JavaScriptSerializer(); serializer.MaxJsonLength = Int32.MaxValue;
Как насчет некоторых атрибутов магии?
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] public class MaxJsonSizeAttribute : ActionFilterAttribute { // Default: 10 MB worth of one byte chars private int maxLength = 10 * 1024 * 1024; public int MaxLength { set { if (value < 0) throw new ArgumentOutOfRangeException("value", "Value must be at least 0."); maxLength = value; } get { return maxLength; } } public override void OnActionExecuted(ActionExecutedContext filterContext) { JsonResult json = filterContext.Result as JsonResult; if (json != null) { if (maxLength == 0) { json.MaxJsonLength = int.MaxValue; } else { json.MaxJsonLength = maxLength; } } } }затем вы можете применить его глобально, используя конфигурацию глобального фильтра или контроллер / действие.
вопрос действительно ли вам действительно нужно вернуть 17k записей? Как вы планируете обрабатывать все данные в браузере? Пользователи не будут прокручивать 17000 строк.
лучший подход состоит в том, чтобы получить только "топ-несколько" записей и загрузить больше по мере необходимости.
для тех, у кого возникают проблемы с MVC3 с JSON, который автоматически десериализуется для связывателя модели и слишком велик, вот решение.
- скопируйте код для класса JsonValueProviderFactory из исходного кода MVC3 в новый класс.
- добавьте строку для изменения максимальной длины JSON перед десериализацией объекта.
- замените класс JsonValueProviderFactory на новый, измененный класс.
спасибо http://blog.naver.com/techshare/100145191355 и https://gist.github.com/DalSoft/1588818 за то, что указал мне в правильном направлении, как это сделать. Последняя ссылка на первом сайте содержит полный исходный код решения.
просто наткнулся на это. Я получаю более 6000 записей. Просто решил, что я просто сделаю несколько пейджингов. Как и в случае, я принимаю номер страницы в моей конечной точке 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 }и добавить свои записи все, что вы были делать с ними в первую очередь. Или просто подождите, пока все звонки закончатся и соберут результаты вместе.
похоже, что нет никакого" неограниченного " значения. Значение по умолчанию-2097152 символа, что эквивалентно 4 МБ строковых данных Юникода.
Как уже было замечено, 17 000 записей трудно использовать в браузере. Если вы представляете агрегированное представление, может быть гораздо эффективнее выполнить агрегацию на сервере и передать только сводку в браузере. Например, рассмотрим файловую систему brower, мы видим только верхнюю часть дерева, а затем выдаем дальнейшие запросы как мы спускаемся вниз. Количество записей, возвращаемых в каждом запросе, сравнительно невелико. Представление в виде дерева может хорошо работать для больших результирующих наборов.
вы можете установить его в конфигурации, как говорили другие, или вы можете установить в отдельном экземпляре сериализатора, например:
var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };
Я решил проблему добавив этот код:
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();
Если вы столкнулись с такого рода проблемой, вы можете использовать ниже метод, чтобы решить эту проблему. Здесь Я Использовал Newtonsoft.
@using Newtonsoft.Json <script type="text/javascript"> var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part)); </script>
использовать
lib\Newtonsoft.Json.dllpublic string serializeObj(dynamic json) { return JsonConvert.SerializeObject(json); }
решение для 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);
нам не нужны никакие изменения на стороне сервера. вы можете исправить это только изменить в интернете.конфигурационный файл это помогло мне. попробуйте это
<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>
альтернатива ASP.NET MVC 5 исправить:
(мой похож на ответ MFCs выше с несколькими небольшими изменениями)
Я не был готов переодеться Json.NET просто еще и в моем случае ошибка произошла во время запроса. Лучшим подходом в моем сценарии было изменение фактического
JsonValueProviderFactoryкоторый применяет исправление к глобальному проекту и может быть выполнен путем редактированияglobal.csфайл как таковой.JsonValueProviderConfig.Config(ValueProviderFactories.Factories);добавить веб -.конфиг запись:
<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но с добавлением конфигурируемой сети.config appsetting valueaspnet: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; } }
если это значение maxJsonLength является int, то насколько большим является его int 32bit / 64bit / 16bit.... я просто хочу быть уверенным, что максимальное значение можно установить в качестве моего maxJsonLength
<scripting> <webServices> <jsonSerialization maxJsonLength="2147483647"> </jsonSerialization> </webServices> </scripting>
вам не нужно делать с web.конфиг Вы можете использовать свойство short во время значения catch передающего списка Например объявить модель как
public class BookModel { public decimal id { get; set; } // 1 public string BN { get; set; } // 2 Book Name public string BC { get; set; } // 3 Bar Code Number public string BE { get; set; } // 4 Edition Name public string BAL { get; set; } // 5 Academic Level public string BCAT { get; set; } // 6 Category }здесь я использую короткие характеристики, как До н. э. =штрихкод BE=книжное издание и так далее
Comments