Могу ли я установить неограниченную длину для maxJsonLength в web.config? - PullRequest
624 голосов
/ 20 июля 2009

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

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

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

Ответы [ 27 ]

9 голосов
/ 29 июля 2013

Если вы получаете эту ошибку от MiniProfiler в MVC, вы можете увеличить значение, установив для свойства MiniProfiler.Settings.MaxJsonResponseSize желаемое значение. По умолчанию этот инструмент игнорирует значение, заданное в config.

MiniProfiler.Settings.MaxJsonResponseSize = 104857600;

Предоставлено mvc-mini-profiler .

8 голосов
/ 03 апреля 2017

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

JsonResult json= Json(classObject, JsonRequestBehavior.AllowGet);
json.MaxJsonLength = int.MaxValue;
return json;
7 голосов
/ 17 января 2017

Как насчет атрибута магии?

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

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

6 голосов
/ 20 сентября 2016

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

JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue;
3 голосов
/ 11 июля 2013

Для тех, у кого возникают проблемы в MVC3 с JSON, который автоматически десериализуется для подшивки модели и слишком велик, вот решение.

  1. Скопируйте код для класса JsonValueProviderFactory из исходного кода MVC3 в новый класс.
  2. Добавьте строку, чтобы изменить максимальную длину JSON до десериализации объекта.
  3. Замените класс JsonValueProviderFactory новым, измененным классом.

Спасибо http://blog.naver.com/techshare/100145191355 и https://gist.github.com/DalSoft/1588818 за указание мне в правильном направлении, как это сделать. Последняя ссылка на первом сайте содержит полный исходный код решения.

3 голосов
/ 20 июля 2009

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

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

3 голосов
/ 28 июня 2013

Вы можете установить его в конфигурации, как уже говорили другие, или вы можете установить индивидуальный экземпляр сериализатора, например:

var js = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue };
2 голосов
/ 20 июля 2009

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

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

2 голосов
/ 13 июля 2013

Просто столкнулся с этим. Я получаю более 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 голосов
/ 20 ноября 2014

Я решил проблему, добавив этот код:

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();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...