Co powoduje tą " nieprawidłową długość dla tablicy znaków Base-64"

Mam tu niewiele do zrobienia. Nie mogę odtworzyć tego lokalnie, ale gdy użytkownicy dostają błąd, dostaję automatyczne powiadomienie o wyjątku e-mail:

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 viewstate. na przykład:

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

Trudno jest odgadnąć źródło błędu bez możliwości odtworzenia błędu lokalnie.

Jeśli ktoś miał jakieś doświadczenie z tym błędem, naprawdę chciałbym wiedzieć, co Ty dowiedziałem się.

Author: Michael, 2009-05-13

12 answers

Widziałem ten błąd spowodowany połączeniem dobrego rozmiaru viewstate i agresywnymi urządzeniami filtrującymi zawartość / zaporami (szczególnie w przypadku instytucji edukacyjnych K-12).

Obejrzeliśmy to, przechowując Viewstate w SQL Server. Przed przejściem do tej trasy, polecam spróbować ograniczyć korzystanie z viewstate nie przechowując niczego dużego w nim i wyłączając go dla wszystkich kontrolek, które go nie potrzebują.

Referencje do przechowywania ViewState w SQL Serwer:
MSDN-przegląd stron
ASP Alliance-prosta metoda przechowywania viewstate w SQL Server
Code Project-ViewState Provider Model

 35
Author: Jimmie R. Houts,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-17 04:50:40

Po przetworzeniu tekstu przez urlDecode, zastępuje on wszystkie znaki ' + 'znakiem''... stąd błąd. Należy po prostu wywołać to stwierdzenie, aby ponownie było kompatybilne z base 64:

        sEncryptedString = sEncryptedString.Replace(' ', '+');
 80
Author: Jalal El-Shaer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 10:52:13

Zgaduję, że coś jest albo kodowanie lub dekodowanie zbyt często - lub że masz tekst z wieloma wierszami w.

Ciągi Base64 muszą być wielokrotnością 4 znaków długości - każde 4 znaki reprezentują 3 bajty danych wejściowych. Jakoś dane o stanie widoku są przekazywane z powrotem przez ASP.NET jest uszkodzona-długość nie jest wielokrotnością 4.

Czy logujesz agenta użytkownika, gdy to nastąpi? Zastanawiam się, czy to gdzieś źle zachowująca się przeglądarka... inną możliwością jest że jakiś proxy robi niegrzeczne rzeczy. Podobnie spróbuj zarejestrować długość zawartości żądania, aby zobaczyć, czy dzieje się to tylko dla dużych żądań.

 21
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-13 16:04:54
int len = qs.Length % 4;
            if (len > 0) qs = qs.PadRight(qs.Length + (4 - len), '=');

Gdzie qs jest dowolnym zakodowanym łańcuchem base64

 10
Author: Bhuvana,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-18 22:48:43

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));
}
 9
Author: Petr Voborník,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-15 21:17:11

Jak inni wspominali, może to być spowodowane, gdy niektóre zapory sieciowe i serwery proxy uniemożliwiają dostęp do stron zawierających dużą ilość danych ViewState.

ASP.NET 2.0 wprowadził mechanizm Chunking ViewState, który rozbija ViewState na łatwe do zarządzania kawałki, pozwalając ViewState przejść przez proxy / firewall bez problemu.

Aby włączyć tę funkcję, po prostu dodaj następującą linię do swojej sieci.plik konfiguracyjny.

<pages maxPageStateFieldLength="4000">

To powinno a nie być używany jako alternatywa dla zmniejszenia rozmiaru ViewState, ale może być skutecznym zabezpieczeniem przed błędem "Invalid length for a Base-64 char array" wynikającym z agresywnych serwerów proxy i tym podobnych.

 8
Author: Red Taz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:32

To niestety nie jest odpowiedź. Po uruchomieniu przerywanego błędu przez jakiś czas i wreszcie będąc wystarczająco zdenerwowanym, aby spróbować go naprawić, jeszcze nie znalazłem poprawki. Ustaliłem jednak przepis na odtworzenie mojego problemu, który może pomóc innym.

W moim przypadku jest to wyłącznie problem localhost, na mojej maszynie dev, która ma również dB aplikacji. Jest to aplikacja. NET 2.0, którą edytuję za pomocą VS2005. 64-bitowa maszyna Win7 ma również zainstalowane VS2008 i. NET 3.5.

Oto co będzie generowanie błędu, z różnych form:

  1. załaduj nową kopię formularza.
  2. wprowadź niektóre dane i / lub postback za pomocą dowolnej kontrolki formularza. Tak długo, jak nie ma znaczącego opóźnienia, powtarzaj ile chcesz i nie występują żadne błędy.
  3. poczekaj chwilę (może 1 lub 2 minuty, nie więcej niż 5) i spróbuj innego postbacka.

Minuta lub dwie opóźnienia "oczekiwanie na localhost", a następnie "połączenie zostało zresetowane" przez przeglądarkę i błąd aplikacji global.asax dzienniki pułapek:

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

W tym przypadku nie jest to Rozmiar viewstate, ale coś wspólnego z buforowaniem strony i/lub ViewState, które wydaje się mnie gryzie. Ustawienie <pages> parametrów enableEventValidation="false" i viewStateEncryption="Never" w Web.config nie zmieniło zachowania. Tak samo ustawienie maxPageStateFieldLength na coś skromnego.

 1
Author: fortboise,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-07 16:22:58

Spójrz na swoje Httphandlery. Zauważyłem kilka dziwnych i całkowicie przypadkowych błędów w ciągu ostatnich kilku miesięcy po zaimplementowaniu narzędzia do kompresji (RadCompression od Telerik). Zauważyłem błędy typu:

  • System.Www.HttpException: nie można zweryfikować danych.

  • System.Www.HttpException: klient odłączony.--- >System.Www.UI.ViewStateException: Invalid ViewState.

I

  • System.FormatException: Nieprawidłowa długość dla tablicy znaków Base-64.

  • System.Www.HttpException: klient odłączony. --- >System.Www.UI.ViewStateException: Invalid ViewState.

Pisałam o tym na moim blogu.

 1
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 15:43:26

Jest to spowodowane ogromnym stanem widoku, w moim przypadku miałem szczęście, ponieważ nie używałem viewstate. Właśnie dodałem enableviewstate="false" na znaczniku formularza i stan widoku poszedł z 35k do 100 znaków

 0
Author: coderman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-01 09:37:01

Podczas wstępnych testów na członkostwo.ValidateUser z SqlMembershipProvider, używam algorytmu hash (SHA1) w połączeniu z salt, a jeśli zmieniłem długość soli na długość nie podzielną 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ć, że jest źródłem tego konkretnego błędu.

 0
Author: John,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-19 15:55:50

Jak powiedział Jon Skeet, łańcuch musi być wielokrotnością 4 bajtów. Ale i tak miałem błąd.

Przynajmniej został usunięty w trybie debugowania. Umieść punkt przerwania na Convert.FromBase64String(), a następnie przejdź przez kod. Cudownie, błąd zniknął dla mnie :) jest to prawdopodobnie związane ze Stanami widoku i podobnymi innymi kwestiami, jak zgłaszali inni.

 0
Author: Hammad Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-26 16:30:03

Oprócz @ jalchr ' s solution , które mi pomogło, odkryłem, że wywołując ATL::Base64Encode z aplikacji c++, aby zakodować zawartość, którą PRZEKAZUJESZ do ASP.NET webservice, potrzebujesz też czegoś innego. Oprócz

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

Z @ jalchr ' s solution, ty również musisz upewnić się, że nie używasz ATL_BASE64_FLAG_NOPAD flaga na ATL::Base64Encode:

 BOOL bEncoded = Base64Encode(lpBuffer,
                    nBufferSizeInBytes,
                    strBase64Encoded.GetBufferSetLength(base64Length),
                    &base64Length,ATL_BASE64_FLAG_NOCRLF/*|ATL_BASE64_FLAG_NOPAD*/);
 0
Author: nspire,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-22 15:37:36