Публикация большого объекта 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);
}