Чи можу я встановити необмежену довжину для maxJsonLength у web.config?


663

Я використовую функцію автозаповнення jQuery. Коли я намагаюся отримати список з більш ніж 17000 записів (кожна не матиме більше 10 знаків), він перевищує довжину і видає помилку:

Інформація про винятки:
Тип винятку: InvalidOperationException Повідомлення про
виключення: Помилка під час серіалізації чи десеріалізації за допомогою JSON JavaScriptSerializer. Довжина рядка перевищує значення, встановлене у властивості maxJsonLength.

Чи можна встановити необмежену довжину maxJsonLengthв web.config? Якщо ні, то яку максимальну довжину я можу встановити?


1
Щось на згадку, що може бути досить очевидним, тому, будь ласка, вибачте мене, якщо ви вже думали, чи це; рядок Json також включає фігурні дужки навколо кожного запису, лапки навколо назви кожного поля [та значення], а також назву поля та значення поля. Тому може бути корисно встановити ім'я поля як єдиний символ, а також переконатися, що якщо значення не є рядком, то ви правильно встановите тип поля, щоб воно не містило лапок.
MichaelJTaylor

Відповіді:


719

ПРИМІТКА: ця відповідь стосується лише веб-служб, якщо ви повертаєте JSON з методу Controller, переконайтесь, що ви також прочитали цю відповідь нижче: https://stackoverflow.com/a/7207539/1246870


MaxJsonLength властивість не може бути необмеженим, являє собою ціле число властивість , яке по замовчуванням 102400 (100k).

Ви можете встановити MaxJsonLengthвластивість на своєму web.config:

<configuration> 
   <system.web.extensions>
       <scripting>
           <webServices>
               <jsonSerialization maxJsonLength="50000000"/>
           </webServices>
       </scripting>
   </system.web.extensions>
</configuration> 

153
Це ціле число, тому максимальне значення, яке можна встановити, становить: 2147483644
David Espart

57
@despart: Ви маєте на увазі 2 147 483 647.
Dercsár

6
@ kmcc049, значення IMO не помиляються, оскільки якщо ви подивитесь на питання, ОП не запитує "яке значення за замовчуванням maxJsonLength?" (BTW, другий за найбільш голосованою відповіддю відповідає на це, неправильне запитання), він намагається встановити це властивість "необмеженим", але оскільки це ціле число, максимальне можливе значення 2147483647вказане як @depsart і @ Descár.
CMS

11
Чудово, але зауважте, що відповідь @David Murdoch нижче, якщо у вас є ця проблема під час використання MVC return Json()або чогось іншого
BritishDeveloper

3
@ Dercsár: у чому справа? 2147483644 - найбільше ціле число, яке ідеально ділиться на 1024.
naveen

461

Якщо ви використовуєте MVC 4 , не забудьте перевірити цією відповіддю .


Якщо ви все ще отримуєте помилку:

  • після встановлення maxJsonLengthвластивості максимальним значенням у web.config
  • і ви знаєте, що довжина ваших даних менша за це значення
  • і ви не використовуєте метод веб-сервісу для серіалізації JavaScript

Ваша проблема, ймовірно, що:

Значення властивості MaxJsonLength стосується лише внутрішнього екземпляра JavaScriptSerializer, який використовується асинхронним рівнем зв'язку для виклику методів веб-служб. ( MSDN: ScriptingJsonSerializationSection.MaxJsonLength Properties )

В основному, "внутрішній" JavaScriptSerializerповажає значення, maxJsonLengthколи викликається з веб-методу; Безпосереднє використання JavaScriptSerializer(або використання через MVC-метод дій / Контролер) не поважає maxJsonLengthвластивість, принаймні, не зsystemWebExtensions.scripting.webServices.jsonSerialization розділу web.config.

Для вирішення цього питання ви можете виконати наступні дії в своєму контролері (або в будь-якому місці):

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 .


5
Ваша відповідь була дуже корисною, оскільки я використовую Json()метод результатів дій у asp.net mvc.
jessegavin

3
Так, я теж страждав Json (). Дякую!
BritishDeveloper

3
Хоча це цілком коректно і заслуговує на своє місце, це одне з тих питань, де варто прочитати повз верхню відповідь :). Дякую!
Найджел

3
Якщо ви використовуєте MVC4, перегляньте також відповідь @fanisch.
гравці

4
Як щодо десеріалізації? Я зустрів цю помилку під час прив'язки моделі дії.
guogangj

345

У 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
);

6
Я можу підтвердити, що вищезазначене працює як шарм у MVC 4, дякую фаніш.
гравці

9
Я можу також підтвердити. Введення цього коду в базовий контролер - це, безумовно, найчистіший запропонований підхід.
парламент

15
Це також працює, просто додавши "MaxJsonLength = Int32.MaxValue" до індивідуального результату дії. У разі, якщо зміна не є бажаною контролером або проектом в масштабі.
Гіпновірус

3
Це найкраща відповідь. MaxJsonLength можна налаштувати на один контролер.
laang

3
ПОПЕРЕДЖЕННЯ: це рішення вимикає стиснення (якщо вимагається) відповіді. Додайте цей фільтр на ваші дії: stackoverflow.com/questions/3802107 / ...
Gorgi Rankovski

60

Ви можете налаштувати максимальну довжину для запитів на json у своєму файлі web.config:

<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


1
Що являє собою збережене значення в цьому цілому числі? Це якась кількість символів? Я думаю, що я запитую, чому використовується ціле число? Дякую!
eaglei22

@ eaglei22 число представляє скільки байтів можна використовувати для maxJsonLength. Як згадувалося в M4N, за замовчуванням 102400 (100 КБ).
Яків Плонке

це не працює для мене, і я не використовую веб-сервіси.
калай

42

якщо ви все ще отримуєте помилку після налаштування web.config, наприклад:

<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;
    }

Я сподіваюся, що це має допомогти.


2
Встановити maxJsonLength в web.config не обов'язково, встановлення jsonResult.MaxJsonLength має бути достатньо (принаймні, це було для мене (MVC5))
hormberg

Це добре, тому що це не глобальна зміна.
rob_james

40

У мене виникли ці проблеми в веб-формах ASP.NET. Це повністю ігнорувало налаштування файлу web.config, тому я зробив це:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

Звичайно, загалом це жахлива практика. Якщо ви надсилаєте стільки даних під час виклику веб-служби, вам слід поглянути на інший підхід.


1
це працювало для вас? де ти розмістив цей код?
користувач1012598

Наша проблема полягала в тому, що у нас з'явилася текстова область, яка дозволила HTML і люди вставляли зображення як HTML, що призвело до того, що запис став дуже великим, і серіалізатор JSON вийшов з ладу. Я думаю, якщо це можна зробити, користувачі зроблять це ...
Марко

Опишіть, будь ласка, куди ми повинні поставити цей код ... @Flea
Koray Durudogan

@KorayDurudogan - я помістив це в метод Ajax, який повертав відповідь, так що в моєму контролері. Сподіваюся, що це допомагає!
блоха

Я не оскаржую вашу відповідь, але намагаюся краще зрозуміти, які кращі підходи існують. У мене є запит, який залежно від критеріїв користувача визначатиме розмір результату. Я повертаю JsonResult, чи має значення, якщо я повернув файл excel?
eaglei22

22

Я полагодив це.

//your Json data here
string json_object="........";
JavaScriptSerializer jsJson = new JavaScriptSerializer();
jsJson.MaxJsonLength = 2147483644;
MyClass obj = jsJson.Deserialize<MyClass>(json_object);

Це працює дуже добре.


Дивовижно! Це єдине рішення, яке працювало для мене, і все одно його краще, оскільки не глобальні зміни. Дякую!
Sealer_05

20

Я слідував за відповіддю вестигалу і дійшов до цього рішення:

Коли мені потрібно було розмістити великий json для дії в контролері, я отримаю відому "Помилка під час десеріалізації за допомогою JSON JavaScriptSerializer. Довжина рядка перевищує значення, встановлене для властивості maxJsonLength. \ R \ n Назва імені параметра: input постачальник цінностей ".

Що я зробив, це створити новий ValueProviderFactory, LargeJsonValueProviderFactory та встановити MaxJsonLength = Int32.MaxValue у методі 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.asax.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);
}

1
Я робив усе, що можу, тільки ваша відповідь врятувала мені день, це повинна була бути прийнята відповідь
Мухаммед Вакас Азіз

З допомогою цього коду ми можемо перевизначити контролер MVC максимальна межа JSON Deserializetion 4 Мб, але є спосіб , щоб перевизначити контролер веб-апі максимальна межа JSon Deserializetion
Мухаммад Waqas Aziz

17

якщо після впровадження вищевказаного доповнення у вашу web.config ви отримаєте "Нерозпізнаний розділ конфігурації system.web.extensions". помилка, то спробуйте додати це до свого web.config у <ConfigSections>розділі:

            <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>

4
У мене була ця проблема. Однак ця відповідь не спрацювала для мене. Замість того, щоб додати описаний тут елемент <sectionGroup>, я просто перемістив увесь нещодавно доданий блок <system.web.extensions> до самого кінця свого web.config ... безпосередньо перед </configuration>. Тоді це спрацювало.
ClearCloud8

Це допомогло, але в моїй ситуації мені потрібно було змінити ваш четвертий рядок на <section name="jsonSerialization" type="System.Web.Configuration.ScriptingJsonSerializationSection, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" allowDefinition="Everywhere"/>, як видно на цій сторінці: forums.asp.net/t/1446510.aspx/1
Натан

@ ClearCloud8 Отримайте цей коментар розповсюджений на цій сторінці негайно.
Джек Наткінс

11

Ви можете записати цей рядок у Контролер

json.MaxJsonLength = 2147483644;

Ви також можете написати цей рядок у web.config

<configuration>
  <system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>
  </system.web.extensions>

`

Щоб бути в безпечній стороні, використовуйте обидва.


10

Якщо ви отримуєте цю помилку від MiniProfiler в MVC, ви можете збільшити значення, встановивши властивість MiniProfiler.Settings.MaxJsonResponseSizeна потрібне значення. За замовчуванням цей інструмент, здається, ігнорує значення, встановлені в config.

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

Люб'язно mvc-міні-профілер .


10

Просто встановіть MaxJsonLength пропорцію в методі Action MVC

JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;

9

Я пропоную встановити його на Int32.MaxValue.

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;

9

Як щодо якоїсь атрибутичної магії?

[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;
            }
        }
    }
}

Тоді ви можете або застосувати його глобально, використовуючи глобальну конфігурацію фільтра або контролер / дію.


Чудова відповідь. Приємне використання спеціальних атрибутів. Цікаво, чи є конкретна (технічна) причина того, що ви встановили за замовчуванням 10 Мб на один байт символів замість Макс (int.MaxValue)?
Джош

@Josh Ні, особливих причин для цього не було.
Балаж

5

Питання справді полягає в тому, чи справді вам потрібно повернути записи в 17 тис? Як ви плануєте обробляти всі дані у браузері? Користувачі все одно не будуть прокручувати 17000 рядків.

Кращим підходом є отримання лише записів «кількох кращих» та завантаження більше, якщо потрібно.


1
Список за замовчуванням від json дасть записи 17k. Але функція автозаповнення буде перелічувати лише записи, які відповідають символам, які користувач вводить, тому не потрібно більше прокручувати список. Отже, мені потрібно встановити необмежену довжину для maxJsonLength, яка може серіалізувати дані 17k.
Прасад

6
Ви можете використовувати комбінацію фільтрації на стороні сервера та клієнта. Фільтрувати всі дані на стороні клієнта може бути важко, не кажучи вже про затримку мережі.
Chetan Sastry

1
Невдовзі повернувшись до цього самого питання, я вирішив застосувати оброблювач "пошуку" для автозаповнення, і змусив виклик веб-служби пройти текст "пошук" і виконати запит Top10, використовуючи критерії пошуку як фільтр. Це означало більше індивідуальних запитів ajax, що лише отримання повного списку при завантаженні сторінки, але це також означало, що всі запити / відповіді були набагато меншими.
Майк U

3

Ви можете встановити його в конфігурації, як уже говорили інші, або ви можете встановити в окремому екземплярі серіалізатора, наприклад:

var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };

3

Для тих, хто має проблеми з MVC3 з JSON, який автоматично дезаріалізується для в'яжучої моделі і занадто великий, ось рішення.

  1. Скопіюйте код для класу JsonValueProviderFactory з вихідного коду MVC3 в новий клас.
  2. Додайте рядок, щоб змінити максимальну довжину JSON до того, як об’єкт дезаріалізується.
  3. Замініть клас JsonValueProviderFactory на новий, модифікований клас.

Дякуємо http://blog.naver.com/techshare/100145191355 та https://gist.github.com/DalSoft/1588818 за те, що вказали мені в правильному напрямку, як це зробити. Останнє посилання на першому сайті містить повний вихідний код рішення.


3

Якщо ви зіткнулися з подібною проблемою в View, ви можете скористатися методом нижче, щоб вирішити цю проблему. Тут я використав пакет Newtonsoft .

@using Newtonsoft.Json
<script type="text/javascript">
    var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
</script>

Це означає, що мені не потрібно хвилюватися про максимальну довжину, якщо я використовую Json.NET? Я не думаю, що в Json.NET є спосіб встановити максимальну довжину, тому я сподіваюся, що це просто працює з коробки.
кімбауді

1
Відмінна відповідь дякую! Це також спрацювало, коли я намагався завантажити об’єкт.
користувач1299379

3
 JsonResult result = Json(r);
 result.MaxJsonLength = Int32.MaxValue;
 result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 return result;

2

Здається, що немає "необмеженого" значення. За замовчуванням - 2097152 символів, що еквівалентно 4 Мб рядкових даних Unicode.

Як уже зазначалося, у браузері важко використовувати 17000 записів. Якщо ви представляєте сукупний вигляд, може бути набагато ефективніше зробити агрегацію на сервері та перенести лише зведення в браузер. Наприклад, розглянемо веб-браузера файлової системи, ми бачимо лише верхівку дерева, а потім випробовуємо подальші реквізити під час дрилі вниз. Кількість повернених записів у кожному запиті порівняно невелика. Презентація з видом на дерево може добре працювати для великих наборів результатів.


3
досить химерно за замовчуванням у коді (новий JavaScriptSerializer ()). MaxJsonLength - 2097152 байт, але веб-сервіс ResponseFormatJson - 102400 байт, якщо явно не встановлено.
пограбувати

2

Просто натрапив на це. Я отримую понад 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
}

І додайте свої записи насамперед до того, що ви робили з ними. Або просто зачекайте, поки всі дзвінки завершаться і збийте результати разом.


2

Я вирішив проблему, додавши цей код:

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();

Це здається невдалим рішенням, але цікавим підходом незалежно. Я вважаю це корисним спасибі! Для мене в контролері apsnet mvc 5 мені довелося видалити "Current" з простору імен. Я вніс пару коригувань: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();
ooXei1sh

2

Альтернатива виправлення 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, що налаштовується 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;
    }
}

1
Дякую, що працює ... Дякую @Maxim Гершкович
Джаспер Манікараджай

1

Рішення для веб-форм 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);

1

Нам не потрібні зміни на стороні сервера. ви можете виправити це лише за допомогою файлу 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>



0

Виправлення для ASP.NET MVC: якщо ви хочете виправити його лише для конкретних дій, що спричиняють проблему, кодуйте так:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return Json(someBigObject);
}

ви можете змінити це:

public JsonResult GetBigJson()
{
    var someBigObject = GetBigObject();
    return new JsonResult()
    {
        Data = someBigObject,
        JsonRequestBehavior = JsonRequestBehavior.DenyGet,
        MaxJsonLength = int.MaxValue
    };
}

І функціональність повинна бути однаковою, ви можете просто повернути більший JSON як відповідь.


Пояснення на основі вихідного коду ASP.NET MVC: ви можете перевірити, який Controller.Jsonметод працює у вихідному коді ASP.NET MVC

protected internal JsonResult Json(object data)
{
    return Json(data, null /* contentType */, null /* contentEncoding */, JsonRequestBehavior.DenyGet);
}

Це викликає інший Controller.Jsonметод:

protected internal virtual JsonResult Json(object data, string contentType, Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior
    };
}

де переданий contentTypeі contentEncodingоб’єкт null. Отже, в основному виклик return Json(object)у контролері еквівалентний виклику return new JsonResult { Data = object, JsonRequestBehavior = sonRequestBehavior.DenyGet }. Ви можете використовувати другу форму та параметризуватиJsonResult .

Отже, що відбувається, коли ви встановите MaxJsonLengthвластивість (за замовчуванням це недійсне)? Він передається у JavaScriptSerializer.MaxJsonLengthвластивість, а потім називаєтьсяJavaScriptSerializer.Serialize метод :

JavaScriptSerializer serializer = new JavaScriptSerializer();
if (MaxJsonLength.HasValue)
{
    serializer.MaxJsonLength = MaxJsonLength.Value;
}

if (RecursionLimit.HasValue)
{
    serializer.RecursionLimit = RecursionLimit.Value;
}

response.Write(serializer.Serialize(Data));

І якщо ви не встановите MaxJsonLenghtвластивість серіалізатора, то він приймає значення за замовчуванням, яке становить лише 2 Мб.


-2

якщо це значення maxJsonLength - це int, наскільки великим є його int 32bit / 64bit / 16bit .... я просто хочу бути впевненим, яке максимальне значення я можу встановити як мій maxJsonLength

<scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>

-4

Вам не потрібно робити з web.config Ви можете використовувати коротку властивість під час значення лову перехідного списку. Наприклад, оголосити модель типу

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
}

тут я використовую короткі пропорції, такі як BC = штрих-код BE = книговидання тощо


Це не допоможе, якщо основна частина даних знаходиться у значеннях властивостей
Вікно
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.