Могу ли я установить неограниченную длину для maxJsonLength в web.config?

663

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

Информация об
исключении: Тип
исключения : InvalidOperationException Сообщение об исключении: Ошибка во время сериализации или десериализации с использованием JSON JavaScriptSerializer. Длина строки превышает значение, установленное в свойстве maxJsonLength.

Могу ли я установить неограниченную длину для maxJsonLengthin web.config? Если нет, какую максимальную длину я могу установить?

Прасад
источник
1
Нечто упомянутое, что может быть довольно очевидным, поэтому, пожалуйста, извините, если вы уже подумали, если это так; строка Json также содержит фигурные скобки вокруг каждой записи, кавычки вокруг каждого имени поля [и значения], а также имя и значение поля. Поэтому может быть полезно установить имя поля в виде одного символа, а также убедиться, что если значение не является строкой, вы правильно установите тип поля, чтобы он не содержал кавычек.
MichaelJTaylor

Ответы:

720

ПРИМЕЧАНИЕ. Этот ответ применим только к веб-службам. Если вы возвращаете JSON из метода Controller, обязательно прочитайте также этот ответ SO ниже: 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> 
CMS
источник
153
Это целое число, поэтому вы можете установить максимальное значение: 2147483644
Дэвид Эспарт,
58
@despart: Вы имеете в виду 2 147 483 647.
Dercsár
6
@ kmcc049, IMO значения не неправильные, потому что, если вы посмотрите на вопрос, OP не спрашивает "каково значение по умолчанию maxJsonLength?" (Кстати, второй самый голосующий ответ отвечает на этот неправильный вопрос), он пытается установить для этого свойства значение «неограниченно», но, поскольку это целое число, максимально возможное значение равно 2147483647@depsart и @ Descár.
CMS
11
Замечательно, но обратите внимание на ответ Дэвида Мердока ниже, если у вас возникла эта проблема при использовании MVC return Json()или чего-то еще
BritishDeveloper
3
@ Dercsár: какой смысл? 2147483644 - это наибольшее целое число, которое делится на 1024.
naveen
461

Если вы используете MVC 4 , обязательно ознакомьтесь с этим ответом .


Если вы все еще получаете сообщение об ошибке:

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

Ваша проблема, вероятно, в том, что:

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

По сути, «внутренний» JavaScriptSerializerучитывает значение maxJsonLengthпри вызове из веб-метода; непосредственное использование JavaScriptSerializer(или использование через MVC действие-метод / Controller) не не соблюдать 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
Как насчет десериализации? Я встретил эту ошибку при привязке модели действия.
Гогандж
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
);
fanisch
источник
6
Я могу подтвердить, что все вышеперечисленное работает как шарм в MVC 4, спасибо тебе, фаниш.
Бейерс
9
Я могу также подтвердить. Поместить этот код в базовый контроллер, безусловно, самый чистый предложенный подход.
парламент
15
Это также работает, просто добавив MaxJsonLength = Int32.MaxValue к индивидуальному результату действия. В случае, если изменение не является желательным контроллером или проектом.
Гипновирус
3
Это лучший ответ. MaxJsonLength можно настроить для каждого контроллера.
Лян
3
ВНИМАНИЕ: это решение отключает сжатие (если требуется) ответа. Добавьте этот фильтр к вашему действию: stackoverflow.com/questions/3802107/…
Горги Ранковски
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.

M4N
источник
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 Forms. Он полностью игнорировал настройки файла web.config, поэтому я сделал это:

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

Конечно, в целом это ужасная практика. Если вы отправляете столько данных в вызове веб-службы, вам следует рассмотреть другой подход.

блоха
источник
1
это сработало для вас? где вы разместили этот код?
user1012598
Наша проблема заключалась в том, что у нас была текстовая область, которая позволяла использовать HTML, а люди встраивали изображения в виде HTML, что приводило к тому, что запись становилась очень большой, а сериализатор JSON не работал. Я думаю, если это можно сделать, пользователи сделают это ...
Марко
Пожалуйста, опишите, где мы должны поместить этот код ... @Flea
Корай Дурудоган
@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Параметр name: 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
Я сделал все, что мог, только твой ответ спас мой день, этот ответ должен был быть принят
Мухаммед Вакас Азиз
С помощью этого кода мы можем переопределить максимальный предел десериализации контроллера jC на уровне 4 Мб, но есть ли способ переопределить максимальный предел десериализации контроллера web-api
Мухаммед Вакас Азиз
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>
bkdraper
источник
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-mini-profiler .

wolfyuk
источник
10

Просто установите MaxJsonLength proprty в методе действия MVC

JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;
Афтаб Ахмед Калхоро
источник
9

Я предлагаю установить его в Int32.MaxValue.

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
Santhosh
источник
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 МБ одного байт-символа вместо Max (int.MaxValue)?
Джош
@ Джош Нет, особой причины для этого не было.
Балаш
5

Вопрос в том, действительно ли вам нужно возвращать 17k записей? Как вы планируете обрабатывать все данные в браузере? В любом случае, пользователи не собираются прокручивать 17000 строк.

Лучший подход состоит в том, чтобы извлечь только несколько «верхних» записей и загрузить больше по мере необходимости.

Четан Шастри
источник
1
Список по умолчанию от JSON даст 17 тыс. Записей. Но функция автозаполнения будет перечислять только те записи, которые соответствуют символам, которые вводит пользователь, поэтому не нужно больше прокручивать список. Так что мне нужно установить неограниченную длину для maxJsonLength, который может сериализовать данные 17k.
Прасад
6
Вы можете использовать комбинацию фильтрации на стороне сервера и на стороне клиента. Может быть сложно отфильтровать все данные на стороне клиента, не говоря уже о задержке в сети.
Четан Шастри
1
Придя к этой же проблеме некоторое время назад, я решил реализовать обработчик «onsearch» для автозаполнения, и чтобы вызов веб-службы передавал текст «search» и выполнял запрос 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 за указание в правильном направлении, как это сделать. Последняя ссылка на первом сайте содержит полный исходный код решения.

vestigal
источник
3

Если вы столкнулись с подобного рода проблемами в View, вы можете воспользоваться приведенным ниже методом для их решения. Здесь я использовал пакет Newtonsoft .

@using Newtonsoft.Json
<script type="text/javascript">
    var partData = @Html.Raw(JsonConvert.SerializeObject(ViewBag.Part));
</script>
dush88c
источник
Означает ли это, что мне не нужно беспокоиться о максимальной длине, если я использую Json.NET? Я не думаю, что есть способ установить максимальную длину в Json.NET, поэтому я надеюсь, что он работает "из коробки".
Кимбауди
1
Отличный ответ спасибо! Это также сработало, когда я пытался загрузить объект.
user1299379
3
 JsonResult result = Json(r);
 result.MaxJsonLength = Int32.MaxValue;
 result.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
 return result;
Айканш Манн
источник
2

Похоже, что нет «неограниченного» значения. По умолчанию используется 2097152 символа, что эквивалентно 4 МБ строковых данных Юникода.

Как уже отмечалось, 17 000 записей трудно хорошо использовать в браузере. Если вы представляете агрегированное представление, может быть гораздо эффективнее выполнить агрегацию на сервере и передавать только сводку в браузере. Например, рассмотрим браузер файловой системы, мы видим только верхнюю часть дерева, а затем отправляем дополнительные запросы по мере детализации. Количество записей, возвращаемых в каждом запросе, сравнительно мало. Представление в виде дерева может хорошо работать для больших наборов результатов.

DJNA
источник
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
}

И добавляйте свои записи к тому, что вы делали с ними в первую очередь. Или просто подождите, пока все вызовы не завершатся, и сопоставьте результаты.

vbullinger
источник
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();
jfabrizio
источник
Это похоже на хакерское решение, но интересный подход в любом случае. Я нашел это полезным, спасибо! Для меня в контроллере 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();
ooXei1sh
2

Альтернативный ASP.NET MVC 5 Fix:

(Шахта похожа на ответ МФЦ выше с небольшими изменениями)

Я еще не был готов перейти на 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;
    }
}
Максим Гершкович
источник
1
Спасибо, это работает ... Большое спасибо @Maxim Gershkovich
Джаспер Маникарай
1

Решение для 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);
Der_Meister
источник
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

использование lib\Newtonsoft.Json.dll

public string serializeObj(dynamic json) {        
    return JsonConvert.SerializeObject(json);
}
Буддика Де Сильва
источник
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свойство (по умолчанию оно равно null)? Он передается в 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 32-битное / 64-битное / 16-битное .... я просто хочу быть уверен, какое максимальное значение я могу установить в качестве maxJsonLength

<scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483647">
            </jsonSerialization>
        </webServices>
    </scripting>
Мфо Исаак Молелл
источник
-4

Вам не нужно делать с web.config. Вы можете использовать короткое свойство во время значения 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
}

здесь я использую короткие пропорции, такие как BC = штрих-код BE = книжное издание и т. д.

МД Назрул Ислам
источник
Это не поможет, если большая часть данных находится в значениях свойств
Окно