Что вызывает эту " недопустимую длину для массива символов Base-64"

у меня очень мало, чтобы идти дальше. Я не могу воспроизвести это локально, но когда пользователи получают ошибку, я получаю автоматическое уведомление об исключении электронной почты:

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

Я склонен думать, что есть проблема с данными, которые назначаются viewstate. например:

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

трудно угадать источник ошибки, не будучи в состоянии воспроизвести ошибку локально.

Если у кого-то был опыт работы с этой ошибкой, я очень хотелось бы знать, что вы выяснили.

12 ответов


Я видел эту ошибку, вызванную сочетанием хорошего размера viewstate и агрессивных устройств фильтрации контента/брандмауэров (особенно при работе с учебными заведениями K-12).

мы работали вокруг него, сохраняя Viewstate в SQL Server. Прежде чем идти по этому маршруту, я бы рекомендовал попытаться ограничить использование viewstate, не сохраняя в нем ничего большого и отключая его для всех элементов управления, которые в нем не нуждаются.

ссылки для хранения ViewState в SQL Server:
MSDN-обзор PageStatePersister
ASP Alliance-простой способ хранения viewstate в SQL Server
Проект Кода-Модель Поставщика ViewState


после того, как urlDecode обрабатывает текст, он заменяет все символы ' + 'на''... таким образом, ошибка. Вы должны просто вызвать это утверждение, чтобы сделать его base 64 совместимым снова:

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

Я предполагаю, что что - то слишком часто кодируется или декодируется-или что у вас есть текст с несколькими строками.

строки Base64 должны быть кратны 4 символам в длину-каждые 4 символа представляют 3 байта входных данных. Каким-то образом данные состояния представления передаются обратно ASP.NET поврежден-длина не кратна 4.

вы регистрируете агент пользователя, когда это происходит? Интересно, может, это какой-нибудь дурно воспитанный браузер?.. другой возможно, что есть прокси, делающий непослушные вещи. Аналогично попробуйте зарегистрировать длину содержимого запроса, чтобы вы могли видеть, происходит ли это только для больших запросов.


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

здесь qs любая строка в кодировке base64


попробуйте это:

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));
}

Как упоминали другие, это может быть вызвано тем, что некоторые брандмауэры и прокси-серверы препятствуют доступу к страницам, содержащим большой объем данных ViewState.

ASP.NET 2.0 представил механизм Чанкинга ViewState который разбивает ViewState на управляемые куски, позволяя ViewState проходить через прокси / брандмауэр без проблем.

чтобы включить эту функцию, просто добавьте следующую строку в ваш веб.конфиг файл.

<pages maxPageStateFieldLength="4000">

Это должно не можно использовать в качестве альтернативы уменьшению размера ViewState, но это может быть эффективной остановкой против ошибки "недопустимая длина для массива символов Base-64" в результате агрессивных прокси и тому подобное.


это не ответ, К сожалению. После того, как я столкнулся с прерывистой ошибкой в течение некоторого времени и, наконец, был раздражен достаточно, чтобы попытаться исправить это, я еще не нашел исправления. Я, однако, определил рецепт воспроизведения моей проблемы, который может помочь другим.

в моем случае это исключительно проблема localhost, на моей машине dev, которая также имеет БД приложения. Это .Net приложение 2.0 я редактирую с VS2005. 64-разрядная машина Win7 также имеет VS2008 и .NET 3.5 установленный.

вот что будет генерировать ошибку, из различных форм:

  1. загрузите новую копию формы.
  2. ввести некоторые данные, и/или передачи с любым из элементов управления формы. Пока нет существенной задержки, повторяйте все, что хотите, и ошибок не возникнет.
  3. подождите немного (1 или 2 минуты, может быть, не более 5) и попробуйте другую обратную передачу.

минуту или две задержки "ожидание localhost" и затем" соединение было сброшено " браузером и global.asax журналы ловушек ошибок приложений:

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

в этом случае это не размер viewstate, а что-то связанное с кэшированием страницы и/или viewstate, которое, кажется, кусает меня. Настройка <pages> параметры enableEventValidation="false" и viewStateEncryption="Never" на Web.config поведение не изменилось. Как и установка maxPageStateFieldLength к чему-то скромному.


взгляните на свои HttpHandlers. Я заметил некоторые странные и совершенно случайные ошибки за последние несколько месяцев после того, как я реализовал инструмент сжатия (RadCompression от Telerik). Я замечал ошибки, такие как:

  • Система.Сеть.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.ViewStateException: Недопустимый состояние представления.

и

  • Система.Сеть.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.ViewStateException: недопустимое viewstate.

Я об этом пишет на моем блоге.


Это из-за огромного состояния представления, в моем случае мне повезло, так как я не использовал viewstate. Я просто добавил enableviewstate="false" на теге формы и состоянии просмотра пошло от 35k до 100 символов


во время первоначального тестирования на членство.ValidateUser с SqlMembershipProvider, я использую алгоритм хэша (SHA1) в сочетании с солью, и, если я изменил длину соли на длину, не делимую на четыре, я получил эту ошибку.

Я не пробовал любые исправления выше, но если соль изменяется, это может помочь кому-то определить, что источником данной ошибки.


Как сказал Джон Скит, строка должна быть кратна 4 байтам. Но я все еще получал ошибку.

по крайней мере, он был удален в режиме отладки. Поставьте точку останова на Convert.FromBase64String() затем шаг через код. Чудесным образом, ошибка исчезла для меня :) это, вероятно, связано с состояниями просмотра и аналогичными другими проблемами, о которых сообщали другие.


кроме решение@jalchr это помогло мне, я обнаружил, что при вызове ATL::Base64Encode из приложения c++ для кодирования содержимого, которое вы передаете ASP.NET webservice, вам нужно что-то еще. В дополнение к

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

С решение@jalchr, вы и должны убедиться, что вы не используйте ATL_BASE64_FLAG_NOPAD флаг ATL::Base64Encode:

 BOOL bEncoded = Base64Encode(lpBuffer,
                    nBufferSizeInBytes,
                    strBase64Encoded.GetBufferSetLength(base64Length),
                    &base64Length,ATL_BASE64_FLAG_NOCRLF/*|ATL_BASE64_FLAG_NOPAD*/);