57 votes

Devrais-je ignorer l’erreur occasionnelle Viewstate non valide?

De temps en temps (une fois par jour environ), nous constatons les types d'erreur suivants dans nos journaux pour une application ASP.NET 3.5.

  • Etat de vue invalide
  • Argument de publication ou de rappel non valide

S'agit-il de quelque chose qui "se produit" de temps en temps avec une application ASP.NET? Quelqu'un recommanderait-il que nous passions beaucoup de temps à essayer de diagnostiquer la cause des problèmes?

51voto

blowdart Points 28735

Eh bien, il dépend. Non valide viewstate peut se produire pour une variété de raisons.

  1. Viewstate est trop gros et n'a pas fini de rendre avant qu'un utilisateur provoque une publication sur la page. La solution est généralement de désactiver tous les contrôles qui déclenchent des publications et de leur permettre de côté client une fois que la page a fini de se charger, à voir http://blogs.msdn.com/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error.aspx
  2. Vous êtes à l'aide de viewstate Mac (et vous devriez être, pour des raisons de sécurité), mais vous n'avez pas défini une clé machine et l'application de la piscine a recyclé en générer un nouveau. N'oubliez pas de mettre un ViewStateUserKey.
  3. Quelqu'un utilise une vieille version d'IE sur mac où il tronque les champs de formulaire masqué. Dans ce cas, vous aurez besoin pour aller de l'état d'affichage de la page dans l'état de session.
  4. MAC Viewstate questions généralement indiquent que vous êtes sur une batterie de serveurs web et d'avoir oublié de configurer une machine clé dans le web.config. Toutefois, si vous avez fait cela, alors il est probablement quelqu'un qui essaie de faire de mauvaises choses (les robots qui postent des commentaires, quelqu'un qui essaie de déclencher des événements pour les personnes handicapées contrôles etc.) La cause de ces devrait être traqué si ce n'est à écarter les problèmes de sécurité potentiels.

Quoi que vous fassiez, ne pas éteindre l'état d'affichage ou d'un événement de validation.

7voto

Tim Almond Points 1887

Un problème peut être lié au fait que les routeurs des utilisateurs tronquent les champs de formulaire. Pour contourner ce problème, définissez MaxPageStateFieldLength sur un nombre réduit (comme 100) dans web.config, et ViewState est scindé en petits morceaux. C'est très simple à faire, et cet article l' explique complètement.

4voto

JohannesH Points 3817

Les Exceptions ne se produit pas par hasard" de temps à autre. Ils se présentent toujours pour des raisons valables, certains sont déjà répertoriés dans les autres réponses.

Toutefois, afin d'atténuer les problèmes avec ViewState envisagez de le désactiver complètement. Comme ASP.NET les développeurs nous ont souvent tendance à utiliser ViewState dans toutes sortes d'endroits où il n'est pas nécessaire, parce que sa valeur par défaut. J'ai l'habitude de penser à l'aide de html statique avant je considère que l'utilisation d'un contrôle. Si vous décidez de l'utiliser un contrôle de penser si il a vraiment besoin d'ViewState être activé. La désactivation souvent conduire à de meilleurs temps de chargement de page, si vous le pouvez, faire.

Je voudrais qu'il soit désactivé par défaut, de sorte que les gens ont été forcés de penser de cette façon, mais il ne l'est pas.

Mise à jour pour répondre à un commentaire:

Du haut de ma tête j'arrive avec 3 possibilités pour désactiver le ViewState.

  1. Désactiver le ViewState si les données sont chargées sur chaque publication. Ce sera souvent le cas si vous êtes la construction d'AJAX sites (c'est vrai AJAX pas que UpdatePanel genre ;) ), où vous généralement de charger des données sur la première charge puis recharger/mise à jour des données à l'aide de requêtes AJAX. Dans certains cas, vous pouvez même charger des données à chaque visite dans le seul but de la désactivation de l'état d'affichage, et puis mettre en cache les données sur le serveur à la place.

  2. Vous pouvez également envisager la désactivation de l'état d'affichage si vous databind le contenu qui est vraiment statique. Parfois, je trouve une liste qui est lié aux données à un petit statique basedata table dans la base de données ou quelque chose comme ça. Maintenant, cela peut être dangereux, mais si je suis convaincu que les données ne changeront pas je pourrais déplacer les données dans la page de contenu statique (vous pouvez l'envelopper dans un contrôle distinct de sorte que vous n'aurez pas plusieurs statique des copies des données). Mais si les données sont ensuite FAIRE le changement, vous devrez modifier manuellement.

  3. Des commandes simples, tels que les Étiquettes sont souvent de bons candidats pour la désactivation de l'état d'affichage.

Enfin, vous pouvez passer à ASP.NET framework MVC et vague au revoir à ces problèmes pour toujours, c'est ce que je prévois de faire, même si je ferai face à d'autres problèmes. ;)

4voto

Tom Halladay Points 2387

BlowDart a le droit de répondre de la non Valide Viewstate problème. C'est probablement votre pool d'application recyclage et la modification de la clé de chiffrement.

Voir ces messages de soutien:

http://stackoverflow.com/questions/728513/erratic-invalid-viewstate-issue-in-net-application/728539#728539

http://stackoverflow.com/questions/682788/how-do-i-use-persistant-cookies-with-asp-net-membership/1049555#1049555

1voto

teedyay Points 10833

Il n'y a pas beaucoup que vous pouvez faire au sujet de l'ex - je piège de telles exceptions et de rebond de l'utilisateur vers une page d'erreur avec un message du genre "La page que vous avez sur a expiré. Ce qui se passe habituellement, lorsque vous essayez de revisiter une page où vous aviez déjà saisi des données."

Je vois le second le plus sur un assez grand des pages qui utilisent les UpdatePanels. Je pense que c'est quand les messages de l'utilisateur (ou, éventuellement, des appels à l'arrière) avant que la page a fini de charger, donc pas tout le code javascript qui se fait toucher sur la fin de la page a lancé.

Encore une fois, il n'y a pas beaucoup que vous pouvez faire, sauf, montrent assez sympathique message sur votre page d'erreur.

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