Mam tu bardzo mało do roboty. Nie mogę odtworzyć tego lokalnie, ale gdy użytkownicy otrzymają błąd, otrzymuję automatyczne powiadomienie e-mail o wyjątku:
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()
Jestem skłonny myśleć, że jest problem z danymi, które są przypisywane do stanu widoku. Na przykład:
List<int> SelectedActionIDList = GetSelectedActionIDList();
ViewState["_SelectedActionIDList"] = SelectedActionIDList;
Trudno odgadnąć źródło błędu bez możliwości lokalnego odtworzenia błędu.
Jeśli ktoś miał jakieś doświadczenie z tym błędem, bardzo chciałbym wiedzieć, czego się dowiedziałeś.
Po przetworzeniu tekstu przez urlDecode zamienia wszystkie znaki „+” na „”… stąd błąd. Powinieneś po prostu wywołać tę instrukcję, aby ponownie była zgodna z bazą 64:
sEncryptedString = sEncryptedString.Replace(' ', '+');
źródło
+
naprawionymi. Bohater!Domyślam się, że coś koduje lub dekoduje zbyt często - lub że masz tekst z wieloma wierszami.
Ciągi Base64 muszą być wielokrotnością 4 znaków - każde 4 znaki to 3 bajty danych wejściowych. W jakiś sposób dane o stanie widoku przesyłane z powrotem przez ASP.NET są uszkodzone - długość nie jest wielokrotnością 4.
Czy rejestrujesz agenta użytkownika, gdy to nastąpi? Zastanawiam się, czy to gdzieś źle zachowana przeglądarka ... Inną możliwością jest to, że proxy robi niegrzeczne rzeczy. Podobnie spróbuj zarejestrować długość treści żądania, aby zobaczyć, czy dzieje się to tylko w przypadku dużych żądań.
źródło
Spróbuj tego:
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)); }
źródło
int len = qs.Length % 4; if (len > 0) qs = qs.PadRight(qs.Length + (4 - len), '=');
gdzie
qs
jest dowolny ciąg zakodowany algorytmem Base64źródło
Jak wspominali inni, może to być spowodowane przez niektóre zapory i serwery proxy, które uniemożliwiają dostęp do stron zawierających dużą ilość danych ViewState.
W ASP.NET 2.0 wprowadzono mechanizm ViewState Chunking, który dzieli ViewState na łatwe do zarządzania fragmenty, umożliwiając ViewState bezproblemowe przejście przez serwer proxy / zaporę.
Aby włączyć tę funkcję, po prostu dodaj następujący wiersz do pliku web.config.
<pages maxPageStateFieldLength="4000">
Nie należy tego używać jako alternatywy dla zmniejszania rozmiaru ViewState, ale może to być skuteczna ochrona przed błędem „Nieprawidłowa długość tablicy znaków Base-64” wynikającym z agresywnych serwerów proxy i tym podobnych.
źródło
Niestety, to nie jest odpowiedź. Po pewnym czasie napotkania sporadycznego błędu i w końcu dostatecznie zdenerwowany, aby spróbować go naprawić, jeszcze nie znalazłem rozwiązania. Ustaliłem jednak przepis na odtworzenie mojego problemu, który może pomóc innym.
W moim przypadku jest to WYŁĄCZNIE problem z hostem lokalnym na moim komputerze deweloperskim, który ma również bazę danych aplikacji. To aplikacja .NET 2.0, którą edytuję za pomocą VS2005. Na 64-bitowym komputerze z systemem Windows 7 są również zainstalowane programy VS2008 i .NET 3.5.
Oto, co spowoduje błąd w różnych formach:
Minuta lub dwie opóźnienie „oczekiwanie na localhost”, a następnie „Połączenie zostało zresetowane” przez przeglądarkę oraz
global.asax
dzienniki pułapek błędów aplikacji:W tym przypadku to nie ROZMIAR stanu widoku, ale coś, co ma związek z buforowaniem strony i / lub stanu widoku, wydaje mi się gryźć. Ustawianie
<pages>
parametrówenableEventValidation="false"
, aviewStateEncryption="Never"
wWeb.config
nie zmienić zachowanie. Ani też nastawienie namaxPageStateFieldLength
coś skromnego.źródło
Spójrz na swoje HttpHandlers. Zauważyłem kilka dziwnych i całkowicie przypadkowych błędów w ciągu ostatnich kilku miesięcy po wdrożeniu narzędzia do kompresji (RadCompression firmy Telerik). Zauważyłem takie błędy jak:
System.Web.HttpException: nie można zweryfikować danych.
System.Web.HttpException: klient rozłączył się. ---> System.Web.UI.ViewStateException: nieprawidłowy stan widoku.
i
System.FormatException: Nieprawidłowa długość tablicy znaków Base-64.
System.Web.HttpException: klient rozłączył się. ---> System.Web.UI.ViewStateException: Nieprawidłowy stan widoku.
I napisał o tym na moim blogu.
źródło
Wynika to z ogromnego stanu widoku. W moim przypadku miałem szczęście, ponieważ nie korzystałem z tego stanu. Właśnie dodałem
enableviewstate="false"
tag w formularzu i stan widoku zmienił się z 35k na 100 znakówźródło
Podczas wstępnego testowania dla Membership.ValidateUser z SqlMembershipProvider używam algorytmu skrótu (SHA1) w połączeniu z solą, a jeśli zmieniłem długość soli na długość niepodzielną przez cztery, otrzymałem ten błąd.
Nie próbowałem żadnej z powyższych poprawek, ale jeśli sól jest zmieniana, może to pomóc komuś wskazać to jako źródło tego konkretnego błędu.
źródło
Jak powiedział Jon Skeet, ciąg musi być wielokrotnością 4 bajtów. Ale nadal otrzymywałem błąd.
Przynajmniej został usunięty w trybie debugowania. Umieść punkt przerwania,
Convert.FromBase64String()
a następnie przejdź przez kod. Cudem, błąd zniknął dla mnie :) Prawdopodobnie jest związany ze stanami View i podobnymi innymi problemami, jak zgłaszali inni.źródło
Oprócz rozwiązania @ jalchr, które mi pomogło, odkryłem, że dzwoniąc
ATL::Base64Encode
z aplikacji C ++ w celu zakodowania treści przekazywanej do usługi sieciowej ASP.NET, potrzebujesz też czegoś innego. OpróczsEncryptedString = sEncryptedString.Replace(' ', '+');
z rozwiązania @ jalchr, musisz również upewnić się, że nie używasz
ATL_BASE64_FLAG_NOPAD
flagi naATL::Base64Encode
:BOOL bEncoded = Base64Encode(lpBuffer, nBufferSizeInBytes, strBase64Encoded.GetBufferSetLength(base64Length), &base64Length,ATL_BASE64_FLAG_NOCRLF/*|ATL_BASE64_FLAG_NOPAD*/);
źródło