Mendapatkan “Permintaan JSON terlalu besar untuk deserialisasi”

203

Saya mendapatkan Galat ini:

Permintaan JSON terlalu besar untuk dideeralisasi.

Inilah skenario di mana ini terjadi. Saya memiliki kelas negara yang memiliki daftar pelabuhan pengiriman di negara itu

public class Country
{
    public int Id { get; set; }
    public string Name { get; set; }
    public List<Port> Ports { get; set; }
}

Saya menggunakan KnockoutJS di sisi klien untuk membuat drop down cascading. Jadi kami memiliki array dua drop down, di mana yang pertama adalah negara, dan yang kedua adalah pelabuhan negara itu.

Sejauh ini semuanya berfungsi dengan baik, ini skrip sisi klien saya:

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

Masalahnya terjadi ketika negara seperti China dipilih, yang memiliki banyak pelabuhan. Jadi jika Anda memiliki 3 atau 4 kali "China" dalam array Anda dan saya ingin mengirimkannya ke server untuk disimpan. Kesalahan terjadi.

Apa yang harus saya lakukan untuk memperbaiki ini?

Kayvan Karim
sumber
4
Bagi siapa pun yang penasaran mengapa ini terjadi atau menulis serializer pelanggan mereka - lihat kode sumber JsonValueProviderFactory.cs - sepertinya tim ASP.NET MVC sengaja menetapkan batas pada 1000.
nikib3ro

Jawaban:

401

Anda harus menyesuaikan properti maxJsonLength ke nilai yang lebih tinggi web.configuntuk menyelesaikan masalah.

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

Tetapkan nilai yang lebih tinggi aspnet:MaxJsonDeserializerMembersdi dalam pengaturan aplikasi:

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

Jika opsi itu tidak berfungsi, Anda bisa mencoba membuat pabrik penyedia nilai json khusus menggunakan JSON.NET seperti yang ditentukan dalam utas ini .

VJAI
sumber
57
Saya sedang mengerjakan aplikasi MVC4 yang membuat serialisasi volume besar (1k +) dari objek json ke controller. Metode system.web.extensions tidak melakukan apa-apa, tetapi pengaturan app adalah perbaikan ajaib. Terima kasih!
TNCodeMonkey
4
aspnet:MaxJsonDeserializerMembersbekerja untuk saya juga. Apakah ada yang tahu di mana ini sebenarnya didokumentasikan?
Matt Burland
1
Tautan MSDN rusak. Tautan yang benar adalah msdn.microsoft.com/en-us/library/…
Ido Ran
14
Itu bekerja untuk saya, tetapi baru tahu ini: support.microsoft.com/kb/2661403 ... Meningkatkan nilai ini di atas pengaturan default meningkatkan kerentanan server Anda terhadap kerentanan Denial of Service yang dibahas dalam buletin keamanan MS11- 100.
Pahlawan
4
Nilai default aspnet: MaxJsonDeserializerMembers tampaknya 1000: msdn.microsoft.com/en-us/library/hh975440.aspx .
CRice
2

Jika Anda tidak ingin mengubah pengaturan global di konfigurasi web

Menggunakan pengaturan global akan mengaktifkan respons json besar di seluruh aplikasi Anda yang dapat membuka Anda hingga penolakan serangan layanan.

Jika beberapa lokasi pilihan diizinkan, Anda dapat dengan cepat menggunakan serialiser json lain menggunakan metode Konten seperti:

using Newtonsoft.Json;

// ...

public ActionResult BigOldJsonResponse() 
{
    var response = ServiceWhichProducesLargeObject();
    return Content(JsonConvert.SerializeObject(response));
}
// ...
Gburton
sumber