「JSONリクエストはデシリアライズするには大きすぎます」を取得


203

私はこのエラーを得ています:

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,
        };
    } (); 

この問題は、ポート数の多い中国のような国が選択されたときに発生します。したがって、配列に「China」が3〜4回あり、それをサーバーに送信して保存したい場合。エラーが発生します。

これを解決するにはどうすればよいですか?


4
なぜこれが発生するのか知りたい、またはカスタマーシリアライザーを作成している人-JsonValueProviderFactory.csのソースコードを見てください-ASP.NET MVCチームが意図的に1000に制限を設定しているようです
nikib3ro

回答:


401

問題を解決するには、でmaxJsonLengthプロパティをより高い値に調整する必要がありますweb.config

<system.web.extensions>
    <scripting>
        <webServices>
            <jsonSerialization maxJsonLength="2147483644"/>
        </webServices>
    </scripting>
</system.web.extensions>

aspnet:MaxJsonDeserializerMembersappSettings でに高い値を設定します。

<appSettings>
  <add key="aspnet:MaxJsonDeserializerMembers" value="150000" />
</appSettings>

これらのオプションが機能しない場合は、このスレッドで指定されているJSON.NETを使用してカスタムjson値プロバイダーファクトリを作成してみてください。


57
私は、jsonオブジェクトの大量(1k +)をコントローラーにシリアル化するMVC4アプリケーションに取り組んでいました。system.web.extensionsメソッドは何もしませんでしたが、appSettingsは魔法の修正でした。ありがとう!
TNCodeMonkey 2012年

4
aspnet:MaxJsonDeserializerMembers私も働いた。これが実際に文書化されている場所を誰かが知っていますか?
Matt Burland 2013

1
MSDNリンクが壊れています。正しいリンクはmsdn.microsoft.com/en-us/library/…です
Ido Ran

14
それは私にとって はうまくいきましたが、これを見つけました:support.microsoft.com/kb/2661403 ...この値をデフォルト設定より大きくすると、セキュリティ情報MS11-で説明されているサービス拒否の脆弱性に対するサーバーの脆弱性が高まります。 100。
ヒーロー

4
aspnet:MaxJsonDeserializerMembersのデフォルト値は1000のようです:msdn.microsoft.com/en-us/library/hh975440.aspx
CRice

2

ウェブ設定のグローバル設定を変更したくない場合

グローバル設定を使用すると、アプリケーション全体で大きなjson応答がアクティブになり、サービス拒否攻撃を受ける可能性があります。

いくつかの選択場所がこれを許可されている場合、次のようにContentメソッドを使用して別のjsonシリアライザーを非常にすばやく使用できます。

using Newtonsoft.Json;

// ...

public ActionResult BigOldJsonResponse() 
{
    var response = ServiceWhichProducesLargeObject();
    return Content(JsonConvert.SerializeObject(response));
}
// ...
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.