2012-06-10 26 views
166

tôi nhận được lỗi này:Bắt "Yêu cầu JSON là quá lớn để được deserialized"

The JSON request was too large to be deserialized.

Dưới đây là một kịch bản mà điều này xảy ra. Tôi có một nhóm quốc gia có danh sách các cảng vận chuyển của quốc gia đó

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

Tôi sử dụng KnockoutJS ở phía máy khách để tạo danh sách thả xuống xếp tầng. Vì vậy, chúng tôi có một mảng của hai thả xuống, nơi đầu tiên là quốc gia, và thứ hai là cảng của quốc gia đó.

Tất cả mọi thứ đang làm việc tốt cho đến nay, bên này kịch bản khách hàng của tôi:

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

Vấn đề xảy ra khi một quốc gia như Trung Quốc được chọn, trong đó có rất nhiều của cảng. Vì vậy, nếu bạn có 3 hoặc 4 lần "Trung Quốc" trong mảng của bạn và tôi muốn gửi nó đến máy chủ để lưu. Lỗi xảy ra.

Tôi nên làm gì để khắc phục điều này?

+3

Đối với bất kỳ ai thắc mắc tại sao điều này xảy ra hoặc viết bộ nối tiếp khách hàng của họ - hãy xem [mã nguồn của JsonValueProviderFactory.cs] (https://github.com/mono/aspnetwebstack/blob/master/src/System.Web. Mvc/JsonValueProviderFactory.cs # L118) - có vẻ như đội ASP.NET MVC cố tình đặt giới hạn ở 1000. – kape123

Trả lời

329

Bạn phải điều chỉnh thuộc tính maxJsonLength thành giá trị cao hơn trong web.config để giải quyết vấn đề.

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

Thiết lập một giá trị cao hơn cho aspnet:MaxJsonDeserializerMembers trong appSettings:

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

Nếu những tùy chọn không làm việc bạn có thể thử tạo ra một nhà máy cung cấp dịch vụ giá trị json tùy chỉnh sử dụng JSON. NET theo quy định tại số thread.

+53

Tôi đã làm việc trên một ứng dụng MVC4 đã tuần tự hóa một khối lượng lớn (1k +) đối tượng json đến một bộ điều khiển. Phương thức system.web.extensions không làm gì cả, nhưng appSettings là phép sửa lỗi. Cảm ơn! – TNCodeMonkey

+3

'aspnet: MaxJsonDeserializerMembers' cũng làm việc cho tôi. Có ai biết nơi này thực sự là tài liệu? –

+1

Liên kết MSDN bị hỏng. Liên kết chính xác là http://msdn.microsoft.com/en-us/library/system.web.script.serialization.javascriptserializer.maxjsonlength.aspx –

Các vấn đề liên quan