Erreur 'L'opération n'est pas valide en raison de l'état actuel de l'objet' lors de la publication

170

J'avais une page aspx qui fonctionnait bien, mais du coup j'obtiens l'erreur "L'opération n'est pas valide en raison de l'état actuel de l'objet." chaque fois qu'une publication est effectuée.

La trace de pile est:

à System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded ()
à System.Web.HttpValueCollection.FillFromEncodedBytes (Byte [] octets, encodage)
à System.Web.HttpRequest.FillInFillection ()

Quelqu'un peut-il aider?

Muthukumar
la source

Réponses:

281

Quelqu'un a publié plusieurs champs de formulaire sur votre page. Le nouveau maximum par défaut introduit par la récente mise à jour de sécurité est 1000.

Essayez d'ajouter le paramètre suivant dans le <appsettings>bloc de votre web.config . dans ce bloc, vous maximisez les valeurs MaxHttpCollection, cela remplacera les valeurs par défaut définies par .net Framework. vous pouvez modifier la valeur en conséquence selon vos besoins de formulaire

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="2001" />
 </appSettings>

Pour plus d'informations, veuillez lire cet article. Pour plus d'informations sur le correctif de sécurité de Microsoft, vous pouvez lire cet article de la base de connaissances

Devjosh
la source
40

Je n'ai pas appliqué la pagination sur ma grille et elle s'étend à plus de 600 enregistrements (avec case à cocher, boutons, etc.) et la valeur de 2001 n'a pas fonctionné. Vous pouvez augmenter la valeur, disons 10000 et tester.

<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="10000" />
</appSettings>
Jay Tapaoan
la source
16

Pour ASP.NET 1.1, cela est toujours dû au fait que quelqu'un publie plus de 1000 champs de formulaire, mais le paramètre doit être modifié dans le Registre plutôt que dans un fichier de configuration. Il doit être ajouté en tant que DWORD nommé MaxHttpCollectionKeys dans le registre sous

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0

pour les éditions 32 bits de Windows et

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0

pour les éditions 64 bits de Windows.

Dan Wich
la source
6

Si votre trace de pile ressemble à ce qui suit, vous envoyez une énorme charge d'objets json au serveur

Operation is not valid due to the current state of the object. 
    at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
    at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
    at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
    at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
    at System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
    at Failing.Page_Load(Object sender, EventArgs e) 
    at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
    at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
    at System.Web.UI.Control.OnLoad(EventArgs e)
    at System.Web.UI.Control.LoadRecursive()
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

Pour la résolution, veuillez mettre à jour votre configuration Web avec la clé suivante. Si vous ne parvenez pas à obtenir la trace de la pile, veuillez utiliser fiddler . Si cela ne vous aide toujours pas, essayez d'augmenter le nombre à 10000 ou quelque chose du genre

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

Pour plus de détails, veuillez lire cet article de Microsoft kb

Mandeep Janjua
la source