89 votes

Quelle est la cause de ce "Longueur invalide pour un tableau de chars en Base-64".

Je n'ai pas grand-chose à dire. Je ne peux pas le reproduire localement, mais lorsque les utilisateurs obtiennent l'erreur, je reçois une notification automatique d'exception par courriel.

Message : Longueur non valide pour un tableau de caractères en base-64.

Appelez la pile : at System.Convert.FromBase64String(String s) at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString) at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter. Deserialize(String serializedState) at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState) at System.Web.UI.HiddenFieldPageStatePersister.Load()

Je suis enclin à penser qu'il y a un problème avec les données qui sont assignées à l'état de vue. Par exemple :

List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;

Ne pas être en mesure de reproduire l'erreur localement rend difficile de deviner la source de l'erreur.

Si quelqu'un a eu une expérience avec cette erreur, j'aimerais vraiment savoir ce que vous avez découvert.

83voto

Jalal El-Shaer Points 6027

Après que urlDecode traite le texte, il remplace tous les caractères '+' par ' ' ... d'où l'erreur. Vous devriez simplement appeler cette déclaration pour le rendre à nouveau compatible avec la base 64 :

        sEncryptedString = sEncryptedString.Replace(' ', '+');

36voto

Jimmie R. Houts Points 3761

J'ai vu cette erreur causée par la combinaison d'un viewstate de bonne taille et de dispositifs/pare-feu de filtrage de contenu trop agressifs (surtout lorsqu'il s'agit d'établissements d'enseignement de type K-12).

Nous avons contourné ce problème en stockant Viewstate dans le serveur SQL. Avant d'emprunter cette voie, je vous recommande d'essayer de limiter votre utilisation du Viewstate en n'y stockant rien de volumineux et en le désactivant pour tous les contrôles qui n'en ont pas besoin.

Références pour le stockage de ViewState dans SQL Server :
MSDN - Présentation de PageStatePersister
Alliance ASP - Méthode simple pour stocker l'état de la vue dans le serveur SQL
Code Project - Modèle de fournisseur de ViewState

21voto

Jon Skeet Points 692016

Je pense que le codage ou le décodage est trop fréquent, ou que le texte contient plusieurs lignes.

Les chaînes Base64 doivent avoir une longueur multiple de 4 caractères - chaque 4 caractères représente 3 octets de données d'entrée. D'une manière ou d'une autre, les données de l'état de la vue renvoyées par ASP.NET sont corrompues - la longueur n'est pas un multiple de 4.

Est-ce que vous enregistrez l'agent utilisateur lorsque cela se produit ? Je me demande si ce n'est pas un navigateur qui se comporte mal quelque part... Une autre possibilité est qu'il y ait un proxy qui fasse de vilaines choses. De même, essayez d'enregistrer la longueur du contenu de la requête, afin de voir si cela ne se produit que pour les grosses requêtes.

10voto

Bhuvana Points 51
int len = qs.Length % 4;
            if (len > 0) qs = qs.PadRight(qs.Length + (4 - len), '=');

qs est une chaîne de caractères codée en base64

8voto

Red Taz Points 1201

Comme d'autres l'ont mentionné, cela peut être dû au fait que certains pare-feu et proxies empêchent l'accès aux pages contenant une grande quantité de données ViewState.

ASP.NET 2.0 a introduit le Mécanisme ViewState Chunking qui décompose le ViewState en morceaux gérables, ce qui permet au ViewState de traverser le proxy/pare-feu sans problème.

Pour activer cette fonctionnalité, il suffit d'ajouter la ligne suivante à votre fichier web.config.

<pages maxPageStateFieldLength="40">

Cela devrait pas ne doit pas être utilisée comme une alternative à la réduction de la taille de votre ViewState, mais elle peut être une protection efficace contre l'erreur "Longueur invalide pour un tableau de caractères en base 64" résultant de proxies agressifs et autres.

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