Ich habe hier sehr wenig zu tun. Ich kann dies nicht lokal reproduzieren, aber wenn Benutzer den Fehler erhalten, erhalte ich eine automatische Benachrichtigung über E-Mail-Ausnahmen:
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()
Ich bin geneigt zu glauben, dass es ein Problem mit Daten gibt, die viewstate zugewiesen werden. Beispielsweise:
List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;
Es ist schwierig, die Fehlerquelle zu erraten, ohne den Fehler lokal reproduzieren zu können.
Wenn jemand Erfahrung mit diesem Fehler hat, würde ich wirklich gerne wissen, was Sie herausgefunden haben.
Nachdem urlDecode den Text verarbeitet hat, werden alle '+' Zeichen durch '' ersetzt ... daher der Fehler. Sie sollten diese Anweisung einfach aufrufen, um Base 64 wieder kompatibel zu machen:
quelle
+
behobenes ersetzt wurden. Held!Ich vermute, dass etwas entweder zu oft codiert oder decodiert - oder dass Sie Text mit mehreren Zeilen haben.
Base64-Zeichenfolgen müssen ein Vielfaches von 4 Zeichen lang sein - alle 4 Zeichen stehen für 3 Byte Eingabedaten. Irgendwie sind die von ASP.NET zurückgegebenen Ansichtsstatusdaten beschädigt - die Länge ist kein Vielfaches von 4.
Protokollieren Sie den Benutzeragenten, wenn dies auftritt? Ich frage mich, ob es irgendwo ein schlecht benommener Browser ist ... eine andere Möglichkeit ist, dass es einen Proxy gibt, der ungezogene Dinge tut. Versuchen Sie ebenfalls, die Inhaltslänge der Anforderung zu protokollieren, damit Sie sehen können, ob dies nur bei großen Anforderungen der Fall ist.
quelle
Versuche dies:
quelle
Wo
qs
ist eine Base64-codierte Zeichenfolge?quelle
Wie bereits erwähnt, kann dies verursacht werden, wenn einige Firewalls und Proxys den Zugriff auf Seiten mit einer großen Menge an ViewState-Daten verhindern.
ASP.NET 2.0 führte den ViewState Chunking-Mechanismus ein der den ViewState in verwaltbare , sodass der ViewState problemlos den Proxy / die Firewall passieren kann.
Um diese Funktion zu aktivieren, fügen Sie einfach die folgende Zeile zu Ihrer web.config-Datei hinzu.
Dies sollte nicht als Alternative zur Reduzierung Ihrer ViewState-Größe verwendet werden, kann jedoch ein wirksamer Rückschlag gegen den Fehler "Ungültige Länge für ein Base-64-Zeichenarray" sein, der sich aus aggressiven Proxys und dergleichen ergibt.
quelle
Dies ist leider keine Antwort. Nachdem ich einige Zeit auf den zeitweiligen Fehler gestoßen bin und mich schließlich genug geärgert habe, um zu versuchen, ihn zu beheben, muss ich noch eine Lösung finden. Ich habe jedoch ein Rezept für die Reproduktion meines Problems festgelegt, das anderen helfen könnte.
In meinem Fall handelt es sich NUR um ein Localhost-Problem auf meinem Entwicklungscomputer, auf dem sich auch die Datenbank der App befindet. Es ist eine .NET 2.0-App, die ich mit VS2005 bearbeite. Auf dem Win7 64-Bit-Computer sind auch VS2008 und .NET 3.5 installiert.
Folgendes erzeugt den Fehler in verschiedenen Formen:
Ein oder zwei Minuten Verzögerung "Warten auf localhost" und dann "Verbindung wurde zurückgesetzt" vom Browser und
global.asax
die Anwendungsfehler-Trap-Protokolle der Anwendung:In diesem Fall ist es nicht die GRÖSSE des Ansichtszustands, sondern etwas, das mit dem Zwischenspeichern von Seiten und / oder Ansichtszuständen zu tun hat, das mich zu beißen scheint. Das Einstellen von
<pages>
ParameternenableEventValidation="false"
undviewStateEncryption="Never"
inWeb.config
hat das Verhalten nicht geändert. Auch das SetzenmaxPageStateFieldLength
auf etwas Bescheidenes.quelle
Schauen Sie sich Ihre HttpHandlers an. Ich habe in den letzten Monaten einige seltsame und völlig zufällige Fehler bemerkt, nachdem ich ein Komprimierungswerkzeug (RadCompression von Telerik) implementiert habe. Ich bemerkte Fehler wie:
System.Web.HttpException: Daten können nicht überprüft werden.
System.Web.HttpException: Der Client wurde getrennt .---> System.Web.UI.ViewStateException: Ungültiger Ansichtsstatus.
und
System.FormatException: Ungültige Länge für ein Base-64-Zeichenarray.
System.Web.HttpException: Der Client wurde getrennt. ---> System.Web.UI.ViewStateException: Ungültiger Ansichtsstatus.
Ich habe darüber in meinem Blog geschrieben.
quelle
Dies liegt an einem riesigen Ansichtsstatus. In meinem Fall hatte ich Glück, da ich den Ansichtsstatus nicht verwendet habe. Ich habe gerade hinzugefügt
enableviewstate="false"
das Formular-Tag und der Ansichtsstatus stieg von 35.000 auf 100 Zeichenquelle
Beim ersten Testen auf Membership.ValidateUser mit einem SqlMembershipProvider verwende ich einen Hash-Algorithmus (SHA1) in Kombination mit einem Salt. Wenn ich die Salt-Länge auf eine Länge geändert habe, die nicht durch vier teilbar ist, habe ich diesen Fehler erhalten.
Ich habe keine der oben genannten Korrekturen versucht, aber wenn das Salz geändert wird, kann dies jemandem helfen, dies als Ursache für diesen bestimmten Fehler zu identifizieren.
quelle
Wie Jon Skeet sagte, muss die Zeichenfolge ein Vielfaches von 4 Bytes sein. Aber ich bekam immer noch den Fehler.
Zumindest wurde es im Debug-Modus entfernt. Setzen Sie einen Haltepunkt
Convert.FromBase64String()
und gehen Sie den Code durch. Wie durch ein Wunder ist der Fehler für mich verschwunden :) Er hängt wahrscheinlich mit den Ansichtszuständen und ähnlichen anderen Problemen zusammen, die andere gemeldet haben.quelle
Zusätzlich zu der Lösung von @ jalchr , die mir geholfen hat, stellte ich fest, dass Sie beim Aufrufen
ATL::Base64Encode
von einer C ++ - Anwendung zum Codieren des Inhalts, den Sie an einen ASP.NET-Webservice übergeben, noch etwas anderes benötigen. Zusätzlich zuBei der Lösung von @ jalchr müssen Sie außerdem sicherstellen, dass Sie das
ATL_BASE64_FLAG_NOPAD
Flag nicht verwenden fürATL::Base64Encode
:quelle