2010-06-30 7 views
0

La raison en est qu'il existe un problème spécifique où les points d'exclamation suivis par des espaces sont placés dans le VIEWSTATE par des routeurs de société/serveur/quelque chose.Modifier la chaîne VIEWSTATE avant qu'elle ne soit désérialisée

Après avoir enlevé ceux-ci, le VIEWSTATE est bien et peut être désérialisé (comme confirmé par View State Decoder 2 qui est un programme assez cool).

Alors, ce que je veux faire est de

  1. attraper l'erreur qui se produit
  2. vérifier l'état d'affichage de ce numéro
  3. modifier le VIEWSTATE (enlever! S)
  4. essayer de analyser le VIEWSTATE nouveau

Je travaille à essayer de passer outre la LoadPageStateFromPersistenceMedium dans le System.Web.UI.Page et de la magie de travail à partir de là. Vous travaillez encore dessus ...

+2

Je dois vous suggère de regarder le problème réel - c'est-à-dire quelle que soit l'infrastructure qui gâche vos demandes - plutôt que de coder un correctif fragile pour un problème qui est en dehors de votre système. –

+0

Je serais d'accord normalement, mais c'est un problème intermittent et un correctif de code bon marché a un meilleur résultat dans ce cas. – Dann

Répondre

0

Essayez ces méthodes: SavePageStateToPersistenceMedium et LoadPageStateFromPersistenceMedium que vous pouvez remplacer dans votre page. Là, vous pouvez intercepter le VIEWSTATE qui est rendu dans la page ou provient du champ caché dans la page.

À la votre! Mise à jour - Une fois, j'ai utilisé ceci pour compresser le VIEWSTATE, alors peut-être vous pouvez le changer pour répondre à vos besoins. Voici comment la valeur compressée se charge de la page (dans votre cas celui avec les espaces) et la valeur décompressé est désérialisée comme VIEWSTATE réelle:

protected override object LoadPageStateFromPersistenceMedium() 
    { 
     string vsString = Request.Form["__COMPRESSEDVIEWSTATE"]; 
     byte[] bytes = Convert.FromBase64String(vsString); 
     bytes = Compression.Decompress(bytes); 
     return formatter.Deserialize(Convert.ToBase64String(bytes)); 
    }