Что вызывает эту " недопустимую длину для массива символов 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
Альянс АСП - простой способ, чтобы сохранить состояние представления в 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 минуты, может быть, не более 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*/);