135 votes

Exception MaxJsonLength dans ASP.NET MVC au cours de JavaScriptSerializer

Dans un de mes actions de contrôleur, je suis de retour d'un très grand JsonResult de remplir une grille.

Je suis le suivant InvalidOperationException d'exception:

Erreur lors de la sérialisation ou de la désérialisation en utilisant le JSON JavaScriptSerializer. La longueur de la chaîne dépasse la valeur définie sur le maxJsonLength de la propriété.

Réglage de l' maxJsonLength propriété dans l' web.config à une valeur plus élevée, malheureusement, n'est pas à démontrer un quelconque effet.

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

Je ne veux pas passer comme une chaîne de caractères comme mentionné dans cette SORTE de réponse.

Dans mes recherches je suis tombé sur ce blog où l'écriture d'un propre ActionResult (par exemple, LargeJsonResult : JsonResult) est recommandé pour contourner ce comportement.

Est-ce la seule solution?
Est-ce un bug ASP.NET MVC?
Ai-je raté quelque chose?

Toute aide serait grandement appréciée.

249voto

Orion Edwards Points 54939

Il semble que cela ait été corrigé dans MVC4.

Vous pouvez le faire, ce qui a bien fonctionné pour moi:

 public ActionResult SomeControllerAction()
{
  var jsonResult = Json(veryLargeCollection, JsonRequestBehavior.AllowGet);
  jsonResult.MaxJsonLength = int.MaxValue;
  return jsonResult;
}
 

32voto

SliverNinja Points 15924

Vous pouvez également utiliser ContentResult comme suggéré ici au lieu de sous-classer JsonResult .

 var serializer = new JavaScriptSerializer { MaxJsonLength = Int32.MaxValue, RecursionLimit = 100 };

return new ContentResult()
{
    Content = serializer.Serialize(data),
    ContentType = "application/json",
};
 

27voto

Darin Dimitrov Points 528142

Malheureusement, le paramètre web.config est ignoré par l'implémentation JsonResult par défaut . Donc, je suppose que vous devrez implémenter un résultat JSON personnalisé pour surmonter ce problème.

23voto

John Points 63

Pas besoin d'un cours personnalisé. C'est tout ce qui est nécessaire:

 return new JsonResult { Data = Result, MaxJsonLength = Int32.MaxValue };
 

Result sont les données que vous souhaitez sérialiser.

2voto

glanes Points 1

Vous pouvez essayer de définir dans votre expression LINQ, le champ de ce que vous aurez besoin.

Exemple. Imaginez que vous avez un Modèle avec Id, Nom, prénom, Téléphone et Image (tableau d'octets) et la nécessité de les charger à partir de json dans une liste de sélection.

Requête LINQ:

var listItems = (from u in Users where u.name.Contains(term) select u).ToList();

Le problème ici est "sélectionnez u" qui obtiennent tous les domaines. Donc, si vous avez de grandes photos, booomm.

Comment le résoudre? très, très simple.

var listItems = (from u in Users where u.name.Contains(term) select new {u.Id, u.Name}).ToList();

Les meilleures pratiques sélectionnez le champ que vous allez utiliser.

Rappelez-vous. Ceci est une astuce simple, mais peut aider de nombreuses personnes ASP.NET MVC développeurs.

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