“JSON isteği serileştirilemeyecek kadar büyüktü” alma


203

Bu hatayı alıyorum:

JSON isteği serisini kaldırılamayacak kadar büyüktü.

İşte bunun gerçekleştiği bir senaryo. O ülkenin nakliye limanlarının listesini tutan bir ülke sınıfım var

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

Basamaklı bir çıkış yapmak için istemci tarafında KnockoutJS kullanıyorum. Bu yüzden, birincisi ülke, ikincisi de o ülkenin limanları olan iki açılır menü var.

Her şey şu ana kadar iyi çalışıyor, bu benim istemci tarafı komut dosyası:

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

Sorun, çok sayıda limanı olan Çin gibi bir ülke seçildiğinde ortaya çıkar . Yani dizinizde 3 veya 4 kez "Çin" varsa ve kaydetmek için sunucuya göndermek istiyorum. Hata oluşur.

Bunu düzeltmek için ne yapmalıyım?


4
Meraklı herkes için neden bu olur ya da müşteri seri hale yazma - bakabilirsiniz JsonValueProviderFactory.cs kaynak kodunda ASP.NET MVC ekibi kasıtlı 1000 de sınırı koymak gibi görünüyor -
nikib3ro

Yanıtlar:


402

Sorunu çözmek için maxJsonLength özelliğini daha yüksek bir değere ayarlamanız gerekir web.config.

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

İçin daha yüksek bir değer ayarlayın aspnet:MaxJsonDeserializerMembersAppSettings'i içinde:

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

Bu seçenekler çalışmıyorsa, bu iş parçacığında belirtildiği gibi JSON.NET kullanarak özel bir json değer sağlayıcı fabrika oluşturmayı deneyebilirsiniz .


57
Bir denetleyiciye json nesnelerinin büyük bir birim (1k +) serileştirme bir MVC4 uygulaması üzerinde çalışıyordu. System.web.extensions yöntemi hiçbir şey yapmadı, ancak appSettings sihirli düzeltmeydi. Teşekkürler!
TNCodeMonkey

4
aspnet:MaxJsonDeserializerMembersbenim için de çalıştı. Bunun gerçekte nerede belgelendiğini bilen var mı?
Matt Burland

1
MSDN bağlantısı bozuk. Doğru bağlantı msdn.microsoft.com/en-us/library/…
Ido Ran

14
Benim için çalıştı, ancak şunu öğrendi : support.microsoft.com/kb/2661403 ... Bu değerin varsayılan ayarın üzerine çıkarılması, sunucunuzun güvenlik bülteninde açıklanan Hizmet Reddi güvenlik açığına duyarlılığını artırır MS11- 100.
Kahraman

4
Aspnet: MaxJsonDeserializerMembers varsayılan değeri 1000 gibi görünüyor: msdn.microsoft.com/en-us/library/hh975440.aspx .
CRice

2

Web yapılandırmasında genel bir ayarı değiştirmek istemiyorsanız

Global bir ayar kullanmanız, uygulamanızın tamamı boyunca büyük json yanıtlarını etkinleştirerek sizi bir hizmet reddi saldırısına kadar açabilir.

Birkaç seçim konumuna izin verilirse, İçerik yöntemini kullanarak başka bir json serileştiricisini çok hızlı bir şekilde kullanabilirsiniz:

using Newtonsoft.Json;

// ...

public ActionResult BigOldJsonResponse() 
{
    var response = ServiceWhichProducesLargeObject();
    return Content(JsonConvert.SerializeObject(response));
}
// ...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.