このエラーが発生しています:
JSONリクエストは大きすぎてデシリアライズできません。
これが発生するシナリオを次に示します。その国の港のリストを保持する国のクラスがあります
public class Country
{
public int Id { get; set; }
public string Name { get; set; }
public List<Port> Ports { get; set; }
}
クライアント側でKnockoutJSを使用して、カスケードドロップダウンを作成します。したがって、2つのドロップダウンの配列があります。最初のドロップダウンは国であり、2番目のドロップダウンはその国の港です。
これまでのところ、すべてが正常に機能しています。このクライアント側のスクリプト:
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,
};
} ();
この問題は、lotsのポートを持つ中国のような国が選択されたときに発生します。したがって、アレイに3つまたは4つの「中国」があり、保存するためにサーバーに送信したい場合。エラーが発生します。
これを改善するにはどうすればよいですか?
この問題を解決するには、 maxJsonLength プロパティをweb.config
のより高い値に調整する必要があります。
<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値プロバイダーファクトリを作成してみてください。
グローバル設定を使用すると、アプリケーション全体で大きなjson応答がアクティブになり、サービス拒否攻撃を受ける可能性があります。
いくつかの選択場所が許可されている場合、次のようなContentメソッドを使用して別のjsonシリアライザーを非常にすばやく使用できます。
using Newtonsoft.Json;
// ...
public ActionResult BigOldJsonResponse()
{
var response = ServiceWhichProducesLargeObject();
return Content(JsonConvert.SerializeObject(response));
}
// ...