Что вызывает эту " недопустимую длину для массива символов 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 86

12 ответов:

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

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

ссылки для хранения ViewState в SQL Server:
MSDN-обзор PageStatePersister
Альянс АСП - простой способ, чтобы сохранить состояние представления в SQL сервер
Code Project-ViewState Provider Model

после того, как 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 Chunking mechanism который разбивает ViewState на управляемые куски, позволяя ViewState проходить через прокси / брандмауэр без проблем.

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

<pages maxPageStateFieldLength="4000">

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

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

в моем случае это исключительно локальная проблема, на моей машине 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. Я только что добавил 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*/);