web-dev-qa-db-fra.com

Obtenir "La requête JSON était trop volumineuse pour être désérialisée"

Je reçois cette erreur:

La demande JSON était trop volumineuse pour être désérialisée.

Voici un scénario où cela se produit. J'ai une classe de pays qui détient une liste des ports d'expédition de ce pays

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

J'utilise KnockoutJS côté client pour créer des listes déroulantes en cascade. Nous avons donc un ensemble de deux listes déroulantes, le premier étant le pays et le second les ports de ce pays.

Tout fonctionne bien jusqu'à présent, voici mon script côté client:

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

Le problème survient quand un pays comme la Chine est sélectionné, avec beaucoup de ports. Donc, si vous avez 3 ou 4 fois "Chine" dans votre tableau et que je veux l'envoyer au serveur pour le sauvegarder. L'erreur se produit.

Que dois-je faire pour remédier à cela?

194
Kayvan Karim

Vous devez ajuster la propriété maxJsonLength à une valeur supérieure dans web.config pour résoudre le problème.

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

Définissez une valeur plus élevée pour aspnet:MaxJsonDeserializerMembers dans les appSettings:

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

Si ces options ne fonctionnent pas, vous pouvez essayer de créer une fabrique de fournisseur de valeur json personnalisée à l'aide de JSON.NET, comme indiqué dans ce thread .

385
VJAI

Si vous ne souhaitez pas modifier un paramètre global dans la configuration Web

L'utilisation d'un paramètre global activera des réponses json volumineuses dans l'ensemble de votre application, ce qui pourrait vous exposer à une attaque par déni de service.

Si quelques emplacements de choix sont autorisés, vous pouvez très rapidement utiliser un autre sérialiseur JSON à l'aide de la méthode Content, comme suit:

using Newtonsoft.Json;

// ...

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