我得到了这个错误:
请求太大,无法反序列化。
这是一个发生这种情况的场景。我有一类国家,有该国的航运港口列表。
public class Country
{
public int Id { get; set; }
public string Name { get; set; }
public List<Port> Ports { get; set; }
}
我在客户端使用KnockoutJS进行级联下拉。我们有一个包含两个下拉列表的数组,第一个是国家,第二个是那个国家的港口。
到目前为止,一切都很好,下面是我的客户端脚本:
var k1 = k1 || {};
$(document).ready(function () {
k1.MarketInfoItem = function (removeable) {
var self = this;
self.CountryOfLoadingId = ko.observable();
self.PortOfLoadingId = ko.observable();
self.CountryOfDestinationId = ko.observable();
self.PortOfDestinationId = ko.observable();
};
k1.viewModel = function () {
var marketInfoItems = ko.observableArray([]),
countries = ko.observableArray([]),
saveMarketInfo = function () {
var jsonData = ko.toJSON(marketInfoItems);
$.ajax({
url: 'SaveMarketInfos',
type: "POST",
data: jsonData,
datatype: "json",
contentType: "application/json charset=utf-8",
success: function (data) {
if (data) {
window.location.href = "Fin";
} else {
alert("Can not save your market information now!");
}
},
error: function (data) { alert("Can not save your contacts now!"); }
});
},
loadData = function () {
$.getJSON('../api/ListService/GetCountriesWithPorts', function (data) {
countries(data);
});
};
return {
MarketInfoItems: marketInfoItems,
Countries: countries,
LoadData: loadData,
SaveMarketInfo: saveMarketInfo,
};
} ();
当选择像中国这样有很多港口的国家时,问题就会出现。因此,如果您的数组中有3或4次"China“,我想将其发送到服务器进行保存。出现错误。
我该怎么做才能纠正这个问题呢?
发布于 2019-04-03 21:26:57
如果您不想更改web配置中的全局设置
使用全局设置将在整个应用程序中激活大型json响应,这可能会使您面临拒绝服务攻击。
如果允许几个选择位置,您可以使用Content方法快速使用另一个json序列化程序,如下所示:
using Newtonsoft.Json;
// ...
public ActionResult BigOldJsonResponse()
{
var response = ServiceWhichProducesLargeObject();
return Content(JsonConvert.SerializeObject(response));
}
// ...
发布于 2021-09-14 19:30:15
设置并不总是有效的。处理这个问题的最好方法是通过控制器,您必须编写自己的Serialize JSON方法。这就是我如何解决将一个非常大的json序列化对象作为对jquery .Ajax调用的响应返回的问题。
C#:用ContentResult替换JsonResult数据类型
// GET: Manifest/GetVendorServiceStagingRecords
[HttpGet]
public ContentResult GetVendorServiceStagingRecords(int? customerProfileId, int? locationId, int? vendorId, DateTime? invoiceDate, int? transactionId, int? transactionLineId)
{
try
{
var result = Manifest.GetVendorServiceStagingRecords(customerProfileId, locationId, vendorId, invoiceDate, null, null, transactionId, transactionLineId);
return SerializeJSON(result);
}
catch (Exception ex)
{
Log.Error("Could not get the vendor service staging records.", ex);
throw;
}
}
private ContentResult SerializeJSON(object toSerialize)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
serializer.MaxJsonLength = Int32.MaxValue; // Wahtever max length you want here
var resultData = toSerialize; //Whatever value you are serializing
ContentResult result = new ContentResult();
result.Content = serializer.Serialize(resultData);
result.ContentType = "application/json";
return result;
}
然后在Web.config文件中增加到最大大小
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="999999999" />
</webServices>
</scripting>
</system.web.extensions>
这对我很有效。
https://stackoverflow.com/questions/10966328
复制相似问题