Я столкнулся с проблемой, пытаясь отправить длинные строки JSON на контроллер MVC. Сначала позвольте мне объяснить необходимость, а затем я объясню, что я пытался. Я сохраняю HTML-код пользовательского интерфейса для таблицы в SQL. Таким образом, я могу вытащить его обратно и сделать позже. При этом, когда я пытаюсь отправить сообщение из AJAX на контроллер, я получаю сообщение об ошибке, что достигнута максимальная длина JSON.

Что я пробовал?

Я попытался изменить все настройки в веб-конфигурации и в serializer JSON в контроллере MVC на значения int.MaxLength . Я также изменил свой результат контроллера на результаты содержимого вместо JsonResult . Вот часть текущего кода, который я использую (удалил весь ненужный код и оставил то, что нужно для устранения неполадок).

контроллер:

 [HttpPost] [ValidateInput(false)] /// {amp}lt;summary{amp}gt; /// Inserts / updates a new saved quote template /// {amp}lt;/summary{amp}gt; /// {amp}lt;param name="jsonData"{amp}gt;{amp}lt;/param{amp}gt; public ActionResult SaveQuoteTemplate(string htmlTemplate, int totalRecords, int totalBadRecords, string templateName, string templateDescription, string templateNotes, string templateId) { var serializer = new JavaScriptSerializer() { MaxJsonLength = int.MaxValue }; // For simplicity just use Int32's max value. // You could always read the value from the config section mentioned above. var returnData = new { StatusCodeEntity = ReturnCodeHandler.Status400, StatusMessage = "Unkown error occurred while trying to save the template.", }; var resultSet = new ContentResult { Content = serializer.Serialize(returnData), ContentType = "application/json" }; try { JsonModel{amp}lt;QuoteEntitySavedItemVM{amp}gt; jsonModel = new JsonModel{amp}lt;QuoteEntitySavedItemVM{amp}gt;(); if (!String.IsNullOrEmpty(htmlTemplate)) { string userPrefix = Session["LoginID"] != null ? Session["LoginID"].ToString() : string.Empty; QuoteEntitySavedItemVM qsvm = new QuoteEntitySavedItemVM() { JSON = htmlTemplate, CreationDate = DateTime.Now, Description = templateNotes, TotalRecords = totalRecords, TotalBadRecords = totalBadRecords, Name = String.Format("{0} - {1}", userPrefix, templateName), Id = QPortal.Web.Helpers.Utilities.SafeToInt32(templateId) //convert to int or safely returns 0 if null }; qsvm.Id = _quoteEntityService.SavedQuoteTemplate(qsvm); //returns project id. So will now assign new on or same if update ran if (qsvm.Id == -1) { var badReturn = new { StatusCodeEntity = ReturnCodeHandler.Status400, StatusMessage = "There is already a project with this name. Please change name.", ObjData = new List{amp}lt;QuoteEntitySavedItemVM{amp}gt;() { qsvm } }; resultSet = new ContentResult { Content = serializer.Serialize(badReturn), ContentType = "application/json" }; } else { var goodReturn = new { StatusCodeEntity = ReturnCodeHandler.Status200, StatusMessage = "Project saved @"   DateTime.Now.ToString()   ".", ObjData = new List{amp}lt;QuoteEntitySavedItemVM{amp}gt;() { qsvm } }; resultSet = new ContentResult { Content = serializer.Serialize(goodReturn), ContentType = "application/json" }; } } else { var errorReturn = new { StatusCodeEntity = ReturnCodeHandler.Status400, StatusMessage = "Saving project failed due to submitted quote model to save being null. Please verify that you currently have a network connection or refresh page and try again." }; resultSet = new ContentResult { Content = serializer.Serialize(errorReturn), ContentType = "application/json" }; } } catch (Exception e) { var errorReturn = new { StatusCodeEntity = ReturnCodeHandler.Status500, StatusMessage = "An unknown error occurred while trying to save project. Please refresh page and try again. Details: "   e.Message }; resultSet = new ContentResult { Content = serializer.Serialize(errorReturn), ContentType = "application/json" }; } return resultSet; } 

Просмотр и фрагмент JS:

 //save project function saveQuoteTemplate() { var $templateBody = $("#quoteEntityItemsContainer"), url = '@Url.Action("SaveQuoteTemplate", "Home")', htmlTemplate = $templateBody.html(), totalRecords = $("#quoteEntityItemsContainer").find("tr").length, totalBadRecords = $("#quoteEntityItemsContainer").find("tr.table-danger").length, templateName = $("#txtTemplateNameLabel").text(), templateUserID = $("#txtUserID").text().trim(), templateNotes = $("#taNotes").val(), templateId = $("#txtTemplateNameLabel").attr("projectid"), data = { 'htmlTemplate': htmlTemplate, "totalRecords": totalRecords, "totalBadRecords": totalBadRecords, "templateName": templateUserID   templateName, "templateNotes": templateNotes, "templateId": templateId }; updateProgressNotification('Saving project...'); console.log("MAX LENGTH: 2097152 | 4MB default. This string length is:"   htmlTemplate.length); $.ajax({ url: url, type: 'POST', data: JSON.stringify({ htmlTemplate, totalRecords, totalBadRecords, templateName, templateNotes, templateId }), dataType: 'json', contentType: 'application/json; charset=utf-8', //Ajax evnts success: _saveQuoteTemplateSuccessHandler, error: _saveQuoteTemplateErrorHandler }); $("#txtTemplateNameLabel").text(templateName); storeProjectTempData(); } 

Что мне интересно, так это то, как я могу обойти проблему максимальной длины, которая вызывает сбой на стороне сервера, прежде чем даже ударить контроллер, или я могу изменить JSON, отправляемый на контроллер, как просто строковый параметр, строковый параметр2 и т. Д. так что это не пересылается как JSON?

Большое спасибо как всегда заранее!

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

{amp}lt;requestLimits maxAllowedContentLength="52428800" /{amp}gt; или

 .UseKestrel(options ={amp}gt; { options.Limits.MaxRequestBodySize = 52428800; //50MB }); 

см. https://www.talkingdotnet.com/how-to-increase-file-upload-size-asp-net-core/

Добавьте [FromBody] в действие запроса

 public ActionResult SaveQuoteTemplate([FromBody]string htmlTemplate, int totalRecords, int totalBadRecords, string templateName, string templateDescription, string templateNotes, string templateId) { ... }