Devrais-je ignorer l'erreur occasionnelle de viewstate invalide?
de temps en temps (une fois tous les jours environ) nous voyons les types d'erreurs suivants dans nos journaux pour un ASP.NET 3.5 application
- ViewState invalide
- argument postback ou callback non valide
Sont ces quelque chose que "ça arrive" de temps en temps avec un ASP.NET application? Est-ce que quelqu'un nous conseillerait de passer beaucoup de temps à essayer de diagnostiquer ce qui cause les problèmes?
10 réponses
ça dépend. Viewstate invalide peut se produire pour une variété de raisons.
- Viewstate est trop grand et n'a pas terminé le rendu avant qu'un utilisateur ne provoque un postback sur la page. Le correctif est généralement de désactiver toutes les commandes qui déclenchent les postbacks et de les activer côté client une fois que la page a terminé le chargement - voir http://blogs.msdn.com/tom/archive/2008/03/14/validation-of-viewstate-mac-failed-error.aspx
- vous utilisez viewstate MACs (et vous devriez l'être, pour des raisons de sécurité) mais vous n'avez pas mis de clé machine et le pool d'applications a recyclé en générant une nouvelle. N'oubliez pas de configurer un ViewStateUserKey.
- Quelqu'un utilise une ancienne version D'IE sur le mac où elle tronque les champs cachés. Dans ce cas, vous devrez déplacer viewstate de la page dans session state .
- voir les questions MAC D'État en général indiquez que vous êtes sur une ferme web et que vous avez oublié de définir une Clé machine Dans web.config. Cependant, si vous avez fait cela, c'est probablement quelqu'un qui essaie de faire de mauvaises choses (bots postant des commentaires, quelqu'un qui essaie de déclencher des événements pour les contrôles désactivés, etc.).) La cause de ceux-ci devrait être retracée, ne serait-ce que pour exclure les problèmes de sécurité potentiels.
Quoi que vous fassiez ne pas désactiver le viewstate ou de l'événement validation.
un problème peut être lié au fait que les routeurs utilisateurs tronquent les champs de formulaires. Le moyen de contourner cela est de mettre le MaxPageStateFieldLength à un nombre plus petit (comme 100) dans le web.config et le ViewState se décomposent en petits morceaux. C'est très simple à faire, et cet article l'explique pleinement.
BlowDart a la bonne réponse pour le problème ViewState invalide. C'est probablement votre pool d'applications qui est recyclé et qui change la clé de cryptage.
Voir ces messages de soutien:
Erratique Invalide Viewstate problème dans une .NET application
Prise de connexion de l'utilisateur persistant avec l'ASP .Nette De L'Effectif
Exceptions "ne pas "arriver" de temps à autre. Elles se produisent toujours pour des raisons valables, dont certaines sont déjà énumérées dans les autres réponses.
Cependant, pour atténuer les problèmes avec ViewState envisager de le désactiver complètement. Comme ASP.NET développeurs nous avons souvent tendance à utiliser ViewState dans toutes sortes d'endroits où il n'est pas nécessaire parce que c'est le défaut. Je pense généralement à l'utilisation de html statique avant de considérer l'utilisation d'un contrôle. Si vous décidez de l'utiliser un contrôle pensez à savoir s'il a vraiment besoin de ViewState pour être activé. La désactivation souvent conduire à de meilleurs temps de chargement de page, si vous le pouvez, faire.
j'aimerais qu'il soit désactivé par défaut pour que les gens soient forcés de penser ainsi, mais ce n'est pas le cas.
mise à jour pour répondre commentaire:
du haut de ma tête j'arrive avec 3 occasions de désactiver ViewState.
-
Désactiver ViewState si les données sont chargées sur chaque publication. Ce sera souvent le cas si vous construisez des sites activés par AJAX (c'est-à-dire Real AJAX pas ce genre de UpdatePanel ;) ), où vous chargez habituellement des données sur la première charge puis rechargez/mettez à jour des données en utilisant des requêtes AJAX. Dans certains cas, vous pouvez même charger des données sur chaque visite dans le seul but de désactiver ViewState, et ensuite mettre en cache les données sur le serveur à la place.
-
vous pouvez aussi envisagez de désactiver ViewState si vous avez une base de données de contenu qui est vraiment statique. Parfois je trouve une liste qui est liée à une petite table statique de base de données 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 en tant que contenu statique (vous pourriez l'envelopper dans un contrôle séparé de sorte que vous n'aurez pas plusieurs copies statiques des données). Mais si les données changent alors, vous devrez les changer manuellement.
-
les contrôles simples tels que les étiquettes sont souvent de bons candidats pour désactiver ViewState.
enfin vous pouvez passer à ASP.NET MVC cadre et dire adieu à ces problèmes pour toujours, c'est ce que je prévois de faire, même si je vais faire face à d'autres problèmes. ;)
il n'y a pas grand chose que vous puissiez faire à propos de la première - je piège de telles exceptions et je renvoie l'utilisateur à une page d'erreur avec un message du genre "la page sur laquelle vous étiez a expiré. Cela se produit normalement lorsque vous essayez de revisiter une page où vous aviez déjà entré des données."
je vois ce dernier plus sur des pages assez grandes qui utilisent des paquets UpdatePanels. Je pense que c'est quand l'utilisateur poste en arrière (ou éventuellement rappelle en arrière) avant que la page ait terminé le chargement, donc pas tous les javascript qui obtient marqué sur la fin de la page a lancé.
encore une fois, il n'y a pas grand-chose que vous pouvez faire à leur sujet, à l'exception de montrer un message convenablement amical sur votre page d'erreur.
j'ai eu ce genre d'exception étant jeté dans Mes rondins et avait une cause très différente des autres énumérés ici. J'avais une vue très large de L'État, ce qui fait partie du problème. Mais cela se combinait avec un autre problème pour causer ces exceptions (et peut-être de mauvaises réponses occasionnelles de L'IIS).
la base de code sur laquelle je travaille a un peu de code de fantaisie pour éviter les doubles clics, et dans le cadre de cela il ajoute quelques trucs au javascript de chaque événement de clic de bouton qui désactive le bouton après le premier clic, et puis l'habitude de publication. Mais appeler le postback comme ça était un problème parce que certains de mes boutons avaient déjà un appel postback généré automatiquement par .NET. Donc je finissais avec deux postbacks, dont un avec une vue invalide. Supprimer le postback supplémentaire a arrêté les exceptions pour moi.
je sais que je devrais réduire drastiquement la taille de la ViewState, mais c'est un grand code d'héritage base et un changement comme ça serait très invasif.
état de vue non valide n'ont aucune valeur pour votre logger ou pour les utilisateurs ou pour votre site web,les utilisateurs finaux ne voit jamais ces erreurs. pour éviter cette erreur, essayez d'ajouter ce qui suit Dans Global.ascx :
void Application_Error(object sender, EventArgs e)
{
if (ex is HttpException && ex.InnerException is ViewStateException)
{
Response.Redirect(Request.Url.AbsoluteUri);
return;
}
}
pour plus d'informations, consultez le lien suivant:
https://www.karpach.com/viewstateexception-invalid-viewstate.htm
Ce n'est probablement pas une bonne idée d'ignorer cette erreur. En plus de toutes les réponses ci-dessus, vous voudrez peut-être examiner la taille de votre viewstate. Un viewstate de grande taille peut être tronqué par un serveur mandataire.
si votre état de vue est grand alors il pourrait être une bonne idée d'utiliser un ASP.net trace pour voir ce que les contrôles utilisent viewstate, et où vous pouvez l'éteindre.
selon Wayne Walter Berry dans ce post de blog un autre coupable peut être en utilisant le doctype XHTML dans IE8 sans avoir le markup conforme XHTML sur la page. Cela peut amener IE8 à envoyer des paramètres brouillés à scriptresource.axd et jeter les invalides viewstate exception.
il recommande de s'assurer que tous les blocs javascript sont emballés avec // <![CDATA[]]>
ou tout simplement changer le doctype (ce qui pourrait causer d'autres problèmes css/Style sur votre page.)
mise à jour: Microsoft a annoncé que le bug suivant pour IE 8 corrige ce problème:
http://blogs.msdn.com/ieinternals/archive/2010/04/01/IE8-Lookahead-Downloader-Fixed.aspx