“JSON 요청이 너무 커서 직렬화 해제 할 수 없습니다”


203

이 오류가 발생합니다.

JSON 요청이 너무 커서 직렬화 해제 할 수 없습니다.

이것이 발생하는 시나리오는 다음과 같습니다. 해당 국가의 배송 포트 목록을 보유한 국가 클래스가 있습니다.

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

클라이언트 측에서 KnockoutJS를 사용하여 계단식 드롭 다운을 만듭니다. 첫 번째는 국가이고 두 번째는 해당 국가의 항구입니다.

내 클라이언트 측 스크립트는 지금까지 모든 것이 잘 작동합니다.

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
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:MaxJsonDeserializerMembers앱에서 더 높은 값을 설정하십시오 .

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

해당 옵션이 작동하지 않으면이 스레드에 지정된대로 JSON.NET을 사용하여 사용자 정의 json 값 제공자 팩토리를 작성할 수 있습니다.


57
대량의 (1k +) json 객체를 컨트롤러에 직렬화하는 MVC4 응용 프로그램을 작업 중이었습니다. system.web.extensions 메소드는 아무것도하지 않았지만 appSettings는 마술로 수정되었습니다. 감사!
TNCodeMonkey

4
aspnet:MaxJsonDeserializerMembers나도 일했다. 아무도 이것이 실제로 문서화 된 곳을 알고 있습니까?
Matt Burland

1
MSDN 링크가 끊어졌습니다. 올바른 링크는 msdn.microsoft.com/en-us/library/…
Ido Ran

14
그것은 나를 위해 일했지만 방금 알았습니다 : support.microsoft.com/kb/2661403 ... 기본 설정보다이 값을 높이면 보안 공지 MS11- 100.
Hero

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.