706 votes

Puis-je définir une longueur illimitée pour maxJsonLength dans web.config ?

J'utilise la fonction d'autocomplétion de jQuery. Lorsque j'essaie d'extraire la liste de plus de 17000 enregistrements (chacun n'aura pas plus de 10 caractères), la longueur est dépassée et l'erreur se produit :

Informations sur les exceptions :
Type d'exception : InvalidOperationException
Message d'exception : Erreur pendant la sérialisation ou la désérialisation à l'aide du JavaScriptSerializer JSON. La longueur de la chaîne dépasse la valeur définie sur la propriété maxJsonLength.

Puis-je définir une longueur illimitée pour maxJsonLength en web.config ? Si non, quelle est la longueur maximale que je peux fixer ?

1 votes

Il y a une chose à mentionner qui est peut-être évidente, alors excusez-moi si vous y avez déjà pensé : la chaîne Json comprend également les crochets autour de chaque enregistrement, les guillemets autour de chaque nom de champ [et valeur], ainsi que le nom et la valeur du champ. Il peut donc être utile de définir le nom du champ comme un caractère unique et de s'assurer que si la valeur n'est pas une chaîne, vous définissez correctement le type de champ afin qu'il ne contienne pas de guillemets.

775voto

CMS Points 315406

NOTE : Cette réponse s'applique uniquement aux services Web. Si vous renvoyez du JSON à partir d'une méthode de contrôleur, assurez-vous de lire également la réponse du SO ci-dessous : https://stackoverflow.com/a/7207539/1246870


El MaxJsonLength ne peut être illimitée, c'est une propriété entière qui a pour valeur par défaut 102400 (100k).

Vous pouvez régler le MaxJsonLength dans votre web.config :

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

161 votes

Il s'agit d'un nombre entier, la valeur maximale que vous pouvez définir est donc : 2147483644.

64 votes

@despart : Vous voulez dire 2 147 483 647.

7 votes

@kmcc049, IMO les valeurs ne sont pas fausses parce que si vous regardez la question, l'OP est ne pas demander "Quelle est la valeur par défaut de maxJsonLength ?" (BTW, la deuxième réponse la plus votée répond à cette question, qui n'est pas la bonne), il essaie de définir cette propriété sur "illimitée", mais comme il s'agit d'un nombre entier, la propriété maximum La valeur possible est 2147483647 comme le soulignent @depsart et @Descár.

498voto

David Murdoch Points 28521

Si vous utilisez MVC 4 n'oubliez pas de consulter cette réponse également.


Si vous recevez toujours l'erreur :

  • après avoir réglé le maxJsonLength à sa valeur maximale dans le web.config
  • et vous savez que la longueur de vos données est inférieure à cette valeur
  • et que vous n'utilisez pas une méthode de service Web pour la sérialisation JavaScript.

votre problème est probablement que :

La valeur de la propriété MaxJsonLength s'applique uniquement à l'instance interne de JavaScriptSerializer qui est utilisée par la couche de communication asynchrone pour invoquer les méthodes des services Web. ( MSDN : ScriptingJsonSerializationSection.Propriété MaxJsonLength )

Fondamentalement, le "interne" JavaScriptSerializer respecte la valeur de maxJsonLength lorsqu'il est appelé à partir d'une méthode web ; l'utilisation directe d'une JavaScriptSerializer (ou l'utiliser via une méthode d'action/Contrôleur MVC) fait que no respecter le maxJsonLength du moins pas à partir de la systemWebExtensions.scripting.webServices.jsonSerialization de la section web.config. En particulier, la section Controller.Json() méthode n'est pas Respectez les paramètres de configuration !

Comme solution de rechange, vous pouvez effectuer les opérations suivantes dans votre contrôleur (ou n'importe où, en fait) :

var serializer = new JavaScriptSerializer();

// For simplicity just use Int32's max value.
// You could always read the value from the config section mentioned above.
serializer.MaxJsonLength = Int32.MaxValue;

var resultData = new { Value = "foo", Text = "var" };
var result = new ContentResult{
    Content = serializer.Serialize(resultData),
    ContentType = "application/json"
};
return result;

Cette réponse est mon interprétation de cette réponse du forum asp.net .

5 votes

Votre réponse m'a été très utile car j'utilise l'outil Json() méthode de résultat d'action dans asp.net mvc.

3 votes

Oui, j'ai aussi souffert de la méthode Json(). Merci !

3 votes

Bien qu'elle soit tout à fait correcte et mérite sa place, c'est l'une de ces questions où il vaut la peine de lire au-delà de la première réponse :). Merci !

373voto

fanisch Points 656

Dans MVC 4, vous pouvez le faire :

protected override JsonResult Json(object data, string contentType, System.Text.Encoding contentEncoding, JsonRequestBehavior behavior)
{
    return new JsonResult()
    {
        Data = data,
        ContentType = contentType,
        ContentEncoding = contentEncoding,
        JsonRequestBehavior = behavior,
        MaxJsonLength = Int32.MaxValue
    };
}

dans votre contrôleur.

Ajout :

Pour ceux qui seraient perplexes quant aux paramètres à spécifier, un appel pourrait ressembler à ceci :

Json(
    new {
        field1 = true,
        field2 = "value"
        },
    "application/json",
    Encoding.UTF8,
    JsonRequestBehavior.AllowGet
);

6 votes

Je peux confirmer que ce qui précède fonctionne comme un charme dans MVC 4, merci fanisch.

10 votes

Je peux également confirmer. Mettre ce code dans un contrôleur de base est certainement l'approche la plus propre proposée.

18 votes

Cela fonctionne également en ajoutant simplement "MaxJsonLength = Int32.MaxValue" au résultat de l'action individuelle. Dans le cas où le changement n'est pas souhaité au niveau du contrôleur ou du projet.

63voto

M4N Points 48758

Vous pouvez configurer la longueur maximale des requêtes json dans votre fichier web.config :

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

La valeur par défaut de maxJsonLength est la suivante 102400 . Pour plus de détails, voir cette page MSDN : http://msdn.microsoft.com/en-us/library/bb763183.aspx

1 votes

Que représente la valeur stockée dans cet entier ? S'agit-il d'une sorte de comptage de caractères ? Je suppose que ce que je demande, c'est pourquoi un nombre entier est utilisé ? Merci !

0 votes

@eaglei22 le nombre représente combien d'octets peuvent être utilisés pour la maxJsonLength. Comme M4N l'a mentionné, 102400 est la valeur par défaut (100KB).

0 votes

Cela ne fonctionne pas pour moi et je n'ai pas utilisé les webservices.

44voto

Flea Points 3308

J'avais ce problème dans ASP.NET Web Forms. Il ignorait complètement les paramètres du fichier web.config, alors j'ai fait ceci :

        JavaScriptSerializer serializer = new JavaScriptSerializer();

        serializer.MaxJsonLength = Int32.MaxValue; 

        return serializer.Serialize(response);

Bien sûr, dans l'ensemble, c'est une pratique terrible. Si vous envoyez autant de données dans un appel de service web, vous devriez envisager une autre approche.

1 votes

Cela a-t-il fonctionné pour vous ? Où avez-vous placé ce code ?

0 votes

Notre problème était dû au fait que nous avions une zone de texte qui autorisait le HTML et que les gens intégraient des images en tant que HTML, ce qui faisait que l'entrée devenait très grande et que le sérialiseur JSON échouait. Je suppose que si cela peut être fait, les utilisateurs le feront...

0 votes

Veuillez décrire où nous devons placer ce code... @Flea

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X