我收到此错误:
JSON请求太大而无法反序列化。
这是发生这种情况的场景。我有一类国家,其中包含该国的航运港口清单
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次“中国”,我想将其发送到服务器进行保存。发生错误。
我应该怎么做才能解决这个问题?
答案 0 :(得分:376)
您必须在 web.config
中将maxJsonLength属性调整为更高的值才能解决问题。
<system.web.extensions>
<scripting>
<webServices>
<jsonSerialization maxJsonLength="2147483644"/>
</webServices>
</scripting>
</system.web.extensions>
在appSettings中为aspnet:MaxJsonDeserializerMembers
设置更高的值:
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>
如果这些选项不起作用,您可以尝试使用此thread中指定的JSON.NET创建自定义json值提供程序工厂。
答案 1 :(得分:0)
使用全局设置将激活整个应用程序中的大型json响应,这可能会使您遭受拒绝服务攻击。
如果允许使用某些选择位置,则可以使用Content方法来快速使用另一个json序列化器,如下所示:
using Newtonsoft.Json;
// ...
public ActionResult BigOldJsonResponse()
{
var response = ServiceWhichProducesLargeObject();
return Content(JsonConvert.SerializeObject(response));
}
// ...