得到“ 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

Answers:


401

您必须将maxJsonLength属性调整为更高的值web.config才能解决此问题。

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

aspnet:MaxJsonDeserializerMembers在appSettings中设置较高的值:

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

如果这些选项不起作用,则可以尝试使用此线程中指定的JSON.NET创建自定义json值提供程序工厂。


57
我正在开发一个MVC4应用程序,该应用程序将大量(1k +)的json对象序列化到控制器。system.web.extensions方法没有做任何事情,但是appSettings是神奇的解决方案。谢谢!
TNCodeMonkey 2012年

4
aspnet:MaxJsonDeserializerMembers也为我工作。有人知道这实际上在哪里记录吗?
马特·伯兰德

1
MSDN链接已断开。正确的链接是msdn.microsoft.com/en-us/library/...
伊然

14
它对我 有用,但发现了这一点:support.microsoft.com/kb/2661403 ...将此值增加到默认设置以上会增加服务器对安全公告MS11-中讨论的“拒绝服务”漏洞的敏感性。 100
英雄

4
aspnet:MaxJsonDeserializerMembers的默认值似乎是1000:msdn.microsoft.com/en-us/library/hh975440.aspx
CRice 2014年

2

如果您不想在Web配置中更改全局设置

使用全局设置将激活整个应用程序中的大型json响应,这可能会使您遭受拒绝服务攻击。

如果允许使用几个选择位置,则可以使用Content方法来快速使用另一个json序列化器,如下所示:

using Newtonsoft.Json;

// ...

public ActionResult BigOldJsonResponse() 
{
    var response = ServiceWhichProducesLargeObject();
    return Content(JsonConvert.SerializeObject(response));
}
// ...
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.