Публикация большого объекта JSON на ASP.NET MVC

Я использую сопоставление nockoutJS pluggin для преобразования моей модели в объекты нокаута. Но у меня проблемы с отправкой большого json-объекта обратно на сервер. Мой вызов ajax выглядит следующим образом:

$.ajax({
    url: "/home/DoStuff",
    type: "POST",
    data: JSON.stringify({ deal: ko.toJS(myObjectViewModel) }),
    contentType: "application/json",
    dataType: "json",
    success: function (result) {
        console.log(result);
    },
    error: function (xhr, status, message) {
        console.log(xhr);
    }
});

Выполнение этого script никогда не попадает в действие DoStuff в контроллере. Когда я проверяю Firebug, POST просто держится. На вкладке "Сеть" Firebug говорится, что "Почтовый орган" - 159,9 КБ, а Total Sent - 165,1 КБ (включая заголовки). Если он был отправлен, почему он не ударил мою точку останова в коде?

Но когда я вместо этого отправляю только свойство myObjectViewModel, он публикуется отлично, и все успешно. Таким образом, это заставляет меня предположить, что проблема связана с размером размещаемых данных. Поэтому я попытался увеличить maxJsonLength.

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

Это не помогло.

Есть ли что-то еще, что я должен делать?

Ответ 1

Я предполагаю, что мой объект превысил максимальное количество членов, которым ASP.NET разрешалось десериализовать. Я добавил ниже, чтобы увеличить его, и он работает.

<appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>

ОБНОВЛЕНИЕ: Таким образом, было больше, потому что после того, как я получил работу, в конечном итоге она перестала работать на то, что, по-видимому, не было причиной. Firebug снова продемонстрировал бы, что сообщение просто вращается, не нажимая код на задней панели. Только после того, как я закрыл Firefox, убил процесс IIS Express и закрыл Visual Studio, он снова начал работать. Но закрытие VS кажется ключевым. После того, как я снова заработал, изменение кода и повторное запуск приложения заставляют проблему снова появиться. Когда проблема возникает, даже жесткое обновление не загрузит страницу. Он просто будет сидеть там. Страница будет перезагружена только после того, как я убью процесс IIS Express и повторюсь с VS.

Итак, я сбросил IIS Express и использовал полный IIS на своей машине. Похоже, это решает проблему. Проводка больших данных json проходит каждый раз без сбоев... даже после смены кода и перекомпиляции.

IIS Express, похоже, обрабатывает размещение небольших количеств json fine, но зажимает на больших наборах. Я не тестировал достаточно тщательно, чтобы подтвердить это на 100%, но я знаю, что производительность более надежна с полным IIS. Не протестировали VS-сервер с веб-сервером.

Среда: Windows 8, обновление Visual Studio 2012 3

Ответ 2

Я передаю большие данные JSON, который содержит почти 1,50,00,000 символов для моего контроллера, с нижеуказанным изменением в web.config:

<appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="2147483644" />
</appSettings>

Это работает для меня очень хорошо.....

Ответ 3

Возможно, вам понадобится увеличить общую максимальную длину запроса (в килобайтах, пример - 1 ГБ)

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="1048576" />
  </system.web>
</configuration>

И если вы используете IIS 7, вероятно, bump максимальная длина содержимого (в байтах, пример - 1 ГБ)

<system.webServer>
  <security>
    <requestFiltering>
      <requestLimits maxAllowedContentLength="1073741824" />
    </requestFiltering>
  </security>
</system.webServer>

Ответ 4

У меня была такая же проблема. Публикация больших данных объекта модели (JSON) с клиентской стороны на действие контроллера сервера. добавив настройки ниже, чтобы конфигурация работала нормально. Благодарю.

<appSettings>
    <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>

Ответ 5

когда вы используете метод контроллера и модель огромна:

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

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

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

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