220

このエラーが発生します:

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

この問題は、港の多い中国のような国を選択した場合に発生します。したがって、アレイに3〜4倍の「中国」があり、それをサーバーに送信して保存したい場合。エラーが発生します。

これを改善するにはどうすればよいですか?

4

3 に答える 3

429

この問題を解決するには、 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値プロバイダーファクトリを作成してみてください。

于 2012-06-10T14:14:00.490 に答える
2

Web構成のグローバル設定を変更したくない場合

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

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

using Newtonsoft.Json;

// ...

public ActionResult BigOldJsonResponse() 
{
    var response = ServiceWhichProducesLargeObject();
    return Content(JsonConvert.SerializeObject(response));
}
// ...
于 2019-04-03T13:26:56.627 に答える
0

設定が常に機能するとは限りません。これを処理する最良の方法は、コントローラーを使用することです。独自のSerializeJSONメソッドを作成する必要があります。これが、jquery.Ajax呼び出しへの応答として非常に大きなjsonシリアル化オブジェクトを返すことを解決した方法です。

C#:JsonResultデータ型をContentResultに置き換えます

// 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>

それは私にとってはうまくいきます。

于 2021-09-14T19:30:14.533 に答える