Исключение MaxJsonLength в ASP.NET MVC во время JavaScriptSerializer - PullRequest
112 голосов
/ 17 апреля 2011

В одном из действий моего контроллера я возвращаю очень большое JsonResult для заполнения сетки.

Я получаю следующее InvalidOperationException исключение:

Ошибка во времясериализация или десериализация с использованием JSON JavaScriptSerializer.Длина строки превышает значение, установленное в свойстве maxJsonLength.

Установка для свойства maxJsonLength в web.config более высокого значения, к сожалению, не дает никакого эффекта.

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

Я не хочу передавать его обратно в виде строки, как указано в этом ТАКОМ ответе.

В своем исследовании я натолкнулся на это сообщение в блогегде рекомендуется написать собственный ActionResult (например, LargeJsonResult : JsonResult), чтобы обойти это поведение.

Это единственное решение?
Это ошибка в ASP.NET MVC?
AmЯ что-то упустил?

Любая помощь будет наиболее ценной.

Ответы [ 14 ]

0 голосов
/ 27 марта 2019

немного другой случай - данные передаются от клиента к серверу.когда вы используете метод контроллера и модель огромна:

    [HttpPost]
    public ActionResult AddOrUpdateConsumerFile(FileMetaDataModelView inputModel)
    {
        if (inputModel == null) return null;
     ....
    }

система выдает исключение, подобное этому «Ошибка во время сериализации или десериализации с использованием JSON JavaScriptSerializer. Длина строки превышает значение, установленное в свойстве maxJsonLength.Имя параметра: input "

Только изменение настроек Web.config недостаточно, чтобы помочь в этом случае.Вы можете дополнительно переопределить сериализатор mvc json для поддержки огромных размеров модели данных или десериализовать модель вручную из запроса.Ваш метод контроллера становится:

   [HttpPost]
    public ActionResult AddOrUpdateConsumerFile()
    {
        FileMetaDataModelView inputModel = RequestManager.GetModelFromJsonRequest<FileMetaDataModelView>(HttpContext.Request);
        if (inputModel == null) return null;
        ......
    }

   public static T GetModelFromJsonRequest<T>(HttpRequestBase request)
    {
        string result = "";
        using (Stream req = request.InputStream)
        {
            req.Seek(0, System.IO.SeekOrigin.Begin);
            result = new StreamReader(req).ReadToEnd();
        }
        return JsonConvert.DeserializeObject<T>(result);
    }
0 голосов
/ 17 октября 2018
    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
        };
    }

Было ли исправление для меня в MVC 4.

0 голосов
/ 21 августа 2018

это сработало для меня

        JsonSerializerSettings json = new JsonSerializerSettings
        {
            ReferenceLoopHandling = ReferenceLoopHandling.Ignore
        };
        var result = JsonConvert.SerializeObject(list, Formatting.Indented, json);
        return new JsonResult { Data = result, MaxJsonLength = int.MaxValue };
0 голосов
/ 15 августа 2017

Вам нужно прочитать из раздела конфигурации вручную, прежде чем ваш код вернет объект JsonResult.Просто прочитайте из web.config в одну строку:

        var jsonResult = Json(resultsForAjaxUI);
        jsonResult.MaxJsonLength = (ConfigurationManager.GetSection("system.web.extensions/scripting/webServices/jsonSerialization") as System.Web.Configuration.ScriptingJsonSerializationSection).MaxJsonLength;
        return jsonResult;

Убедитесь, что вы определили элемент конфигурации в web.config

...