Qu'est-ce qui cause cette " longueur non valide pour un tableau de char base-64"

j'ai très peu d'ici. Je ne peux pas reproduire cela localement, mais lorsque les utilisateurs obtiennent l'erreur, je reçois automatiquement une notification d'exception par courriel:

Invalid length for a Base-64 char array.

  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()

j'ai tendance à penser qu'il y a un problème avec les données qui sont attribuées à viewstate. par exemple:

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

il est difficile de deviner la source de l'erreur sans pouvoir la reproduire localement.

si quelqu'un a eu une expérience avec cette erreur, je voudrais vraiment savoir ce que vous avez trouvé.

86
demandé sur Michael 2009-05-13 19:52:34

12 réponses

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

nous avons travaillé autour de lui en stockant Viewstate dans SQL Server. Avant d'emprunter cette voie, je vous recommande d'essayer de limiter votre utilisation de viewstate en n'y stockant rien de gros et en l'éteignant pour tous les contrôles qui n'en ont pas besoin.

Références pour stocker ViewState dans le serveur SQL:

MSDN-aperçu de Pagetatepersister

ASP Alliance-méthode Simple pour stocker viewstate dans le serveur SQL

Code Project-ViewState Provider Model

35
répondu Jimmie R. Houts 2012-03-17 04:50:40

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

        sEncryptedString = sEncryptedString.Replace(' ', '+');
80
répondu Jalal El-Shaer 2010-03-16 10:52:13

à mon avis, quelque chose est en train d'encoder ou de décoder trop souvent - ou que vous avez du texte avec plusieurs lignes.

base64 les chaînes doivent être un multiple de 4 caractères de longueur - chaque 4 caractères représente 3 octets de données d'entrée. D'une façon ou d'une autre, les données de l'état de vue étant passées en arrière par ASP.NET est corrompu - la longueur n'est pas un multiple de 4.

enregistrez-vous l'agent utilisateur lorsque cela se produit? Je me demande si c'est un mauvais comportement navigateur quelque part... une autre possibilité est qu'il y a un mandataire qui fait de vilaines choses. De même, essayez d'enregistrer la longueur du contenu de la requête, de sorte que vous pouvez voir si cela ne se produit que pour les grandes requêtes.

21
répondu Jon Skeet 2009-05-13 16:04:54
int len = qs.Length % 4;
            if (len > 0) qs = qs.PadRight(qs.Length + (4 - len), '=');

qs est une chaîne codée selon la base64

10
répondu Bhuvana 2011-10-18 22:48:43

essayez ceci:

public string EncodeBase64(string data)
{
    string s = data.Trim().Replace(" ", "+");
    if (s.Length % 4 > 0)
        s = s.PadRight(s.Length + 4 - s.Length % 4, '=');
    return Encoding.UTF8.GetString(Convert.FromBase64String(s));
}
9
répondu Petr Voborník 2012-02-15 21:17:11

comme d'autres l'ont mentionné, cela peut être causé lorsque certains pare-feu et procurations empêchent l'accès à des pages contenant une grande quantité de données ViewState.

ASP.NET 2.0 introduit le ViewState Chunking mécanisme qui divise le ViewState en morceaux gérables, permettant au ViewState de passer par le mandataire / pare-feu sans problème.

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

<pages maxPageStateFieldLength="4000">

cela devrait et non être utilisé comme une alternative à la réduction de la taille de votre ViewState mais il peut être un backstop efficace contre la" longueur invalide pour une base-64 char array " erreur résultant de procurations agressives et similaires.

8
répondu Red Taz 2017-05-23 12:10:32

Ce n'est pas une réponse, malheureusement. Après avoir rencontré l'erreur intermittente pendant un certain temps et avoir finalement été assez ennuyé pour essayer de la corriger, Je n'ai pas encore trouvé de correctif. J'ai, cependant, déterminé une recette pour reproduire mon problème, qui pourrait aider les autres.

dans mon cas, il S'agit uniquement d'un problème localhost, sur ma machine dev qui a aussi le DB de l'application. C'est une application .NET 2.0 que je édite avec VS2005. La machine Win7 64 bits dispose également de VS2008 et .NET 3.5 installés.

voici ce qui va générer l'erreur, à partir d'une variété de formes:

  1. chargez une nouvelle copie du formulaire.
  2. entrer quelques données, et/ou postback avec l'un des contrôles du formulaire. Tant qu'il n'y a pas de retard important, répétez tout ce que vous voulez, et aucune erreur ne se produit.
  3. attendre un peu (1 ou 2 minutes peut-être, pas plus de 5), et essayer un autre postback.

A quelques minutes de retard "en attente pour localhost" et puis "Connexion a été réinitialisée" par le navigateur, et global.asax l 'application erreur Trap logs:

Application_Error event: Invalid length for a Base-64 char array.
Stack Trace:
     at System.Convert.FromBase64String(String s)
     at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
     at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
     at System.Web.UI.HiddenFieldPageStatePersister.Load()

dans ce cas, ce n'est pas la taille de viewstate, mais quelque chose à voir avec la mise en cache de la page et/ou viewstate qui semble me mordre. Le réglage des paramètres <pages> , enableEventValidation="false" et viewStateEncryption="Never" dans le Web.config n'a pas modifié le comportement. Ni le maxPageStateFieldLength à quelque chose de modeste.

1
répondu fortboise 2017-04-07 16:22:58

regardez vos HttpHandlers. J'ai remarqué des erreurs bizarres et complètement aléatoires au cours des derniers mois après avoir implémenté un outil de compression (RadCompression de Telerik). J'ai remarqué des erreurs comme:

  • du Système.Web.HttpException: impossible de valider les données.

  • du Système.Web.HttpException: le client est déconnecté.---> Système.Web.INTERFACE.ViewStateException: ViewState invalide.

et

  • du Système.FormatException: longueur non valide pour un tableau de caractères de base-64.

  • du Système.Web.HttpException: le client est déconnecté. ---> Système.Web.INTERFACE.ViewStateException: ViewState invalide.

I a écrit à propos de ce sur mon blog.

1
répondu Michael 2017-08-22 15:43:26

c'est à cause d'un État de vue énorme, dans mon cas j'ai eu de la chance puisque je n'utilisais pas le viewstate. Je viens d'ajouter enableviewstate="false" sur l'étiquette de formulaire et l'état de vue est passé de 35k à 100 chars

0
répondu coderman 2010-07-01 09:37:01

lors des tests initiaux d'adhésion.ValidateUser avec un Sqlmembershippprovider, j'utilise un algorithme de hachage (SHA1) combiné avec un sel, et, si j'ai changé la longueur du sel à une longueur non divisible par quatre, j'ai reçu cette erreur.

Je n'ai essayé aucune des corrections ci-dessus, mais si le sel est modifié, cela peut aider quelqu'un à identifier que la source de cette erreur particulière.

0
répondu John 2012-03-19 15:55:50

comme L'a dit Jon Skeet, la chaîne doit être multiple de 4 octets. Mais j'étais encore en train de l'erreur.

au moins, il a été supprimé en mode de débogage. Mettez un point d'arrêt sur Convert.FromBase64String() puis passez le code. Miraculeusement, l'erreur a disparu pour moi:) il est probablement lié à des états de vue et d'autres questions similaires que d'autres ont rapporté.

0
répondu Hammad Khan 2014-09-26 16:30:03

en plus de la solution de @jalchr qui m'a aidé, j'ai trouvé qu'en appelant ATL::Base64Encode à partir d'une application c++ pour coder le contenu que vous passez à un ASP.NET webservice, tu as besoin d'autre chose aussi. En plus de

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

à partir de @jalchr la solution de vous aussi nécessité de s'assurer que vous ne pas utiliser les ATL_BASE64_FLAG_NOPAD drapeau ATL::Base64Encode :

 BOOL bEncoded = Base64Encode(lpBuffer,
                    nBufferSizeInBytes,
                    strBase64Encoded.GetBufferSetLength(base64Length),
                    &base64Length,ATL_BASE64_FLAG_NOCRLF/*|ATL_BASE64_FLAG_NOPAD*/);
0
répondu nspire 2017-08-22 15:37:36