powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Недопустимая длина массива знаков Base-64
16 сообщений из 16, страница 1 из 1
Недопустимая длина массива знаков Base-64
    #37721285
new_sergei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся с такой проблемой...

Пытаюсь передать из Silverlight'a на страницу aspx строку, которая содержит xml. Проблема в том, что срабатывает через раз... Выдаёт ошибку Недопустимая длина массива знаков Base-64 . У меня такое подозрение, что это связано с длинной передаваемой xml. Если сама xml небольшая, то всё нормально. Если бОльше - то появляется ошибка.

Код такой:

Silverlight страница

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
......
string str = e.Result;

                byte[] byteArr = new byte[str.Length];
                char[] charArr = str.ToArray();
                
                for (int i = 0; i < str.Length; i++) { byteArr[i] = (byte)charArr[i]; }
                
                string param = "?InvoiceData=" + Convert.ToBase64String(byteArr);
                string urlWithParam = "http://localhost/Invoice.SLA.Web/Invoice.aspx" + param;
                System.Windows.Browser.HtmlPage.Window.Navigate(new Uri(urlWithParam));



aspx страница

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
Response.Clear();
                Response.ContentType = "application/pdf";

                byte[] decodedBytes = Convert.FromBase64String(Request["InvoiceData"]);
                string decodedText = Encoding.UTF8.GetString(decodedBytes);

                XmlDocument xdoc = new XmlDocument();
                xdoc.LoadXml(decodedText);
............



Как это исправить? Строка с xml может быть разной длины.
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721296
new_sergei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас ещё раз проверил - иногда и на небольшого размера xml вылазит эта ошибка... Работает через раз... В чём тут может быть дело?
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721320
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Много разных может быть причин. Вы же саму ошибку не отпостили. И что её выдаёт непонятно.
Сама длина строки в базе64 может быть очень длинная. У интернетэксплорера есть ограничение в длине урл.
Попробуйте другой браузер (не ИЕ). Если и там воспроизведётся, то смотрите свой вэбконфиг.
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721329
new_sergei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShSerge,

Спасибо за ответ.

Вылетает конкретно на aspx странице на строчке

Код: c#
1.
byte[] decodedBytes = Convert.FromBase64String(Request["InvoiceData"]);



Попробовал в Chrome, Firefox - тоже самое. Работает через раз на разных xml. Что нужно смотреть в Web.config?
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721331
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new_sergei, твоя главная ошибка это предположение, что один символ занимает один байт. В разных кодировках это по разному. Более того, разные символам могут занимать разное кол-во байтов. Например, в UTF-8 символы из ASCII диапазона занимают один байт, а русские буквы два. Поэтому никогда не следует приводить символ к байту. Правильный код должен быть таким:
Код: c#
1.
2.
byte[] bytes = Encoding.UTF8.GetBytes(str);
string param = "?InvoiceData=" + Convert.ToBase64String(bytes);


При этом разумеется передающая и принимающая сторона должны использовать одну и ту же кодировку.

Еще один небольшой совет - вместо коллекции Request используй специализированные коллекции (Request.QueryString, Request.Form и т.п.) т.к. а) это ясно указывает источник данных и б) в отдельных случаях это более безопасно т.к. не позволит передать параметры ожидаемые через POST с помощью GET запроса в query string.
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721339
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new_sergei,

Я не помню точно. Нету у меня сейчас ни визуалстудии, ни вэбконфига под рукой. Посмотрите там, по-моему, были какие-то настройки то-ли на длину урл, то-ли на длину гет-запроса. Я один раз с этим сталкивался. Поставил подлиннее - заработало. Причём, в отладчике и так работало. Не работало уже тогда, когда задеплоил.
Само выражение Convert.FromBase64String может быть здесь вовсе и не при чём.
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721346
new_sergei
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
bazile,

Я попробовал сделать так, как Вы сказали.

Код Silverlight:
Код: sql
1.
2.
3.
4.
5.
6.
string str = e.Result;
byte[] bytes = Encoding.UTF8.GetBytes(str);
                string param = "?InvoiceData=" + Convert.ToBase64String(bytes);

                string urlWithParam = "http://localhost/Invoice.SLA.Web/Invoice.aspx" + param;
                System.Windows.Browser.HtmlPage.Window.Navigate(new Uri(urlWithParam));



На странице aspx я ничего не менял, т.е.

Код: c#
1.
2.
3.
4.
5.
Response.Clear();
                Response.ContentType = "application/pdf";

                byte[] decodedBytes = Convert.FromBase64String(Request["InvoiceData"]);
                string decodedText = Encoding.UTF8.GetString(decodedBytes);



Теперь не работает вообще. При каждом переходе Недопустимая длина массива знаков Base-64 на строке
Код: c#
1.
byte[] decodedBytes = Convert.FromBase64String(Request["InvoiceData"]);
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721364
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new_sergei, base64 кодировка использует символ "=", который имеет особое значение для query string параметров. И видимо он передается неправильно. Посмотри отладчиком, что твой код отправляет и что получает. Попробуй изменить код таким образом:
Код: c#
1.
2.
3.
4.
5.
6.
7.
// Silverlight часть
byte[] bytes = Encoding.UTF8.GetBytes(str);
string param = "?InvoiceData=" + HttpServerUtility.UrlTokenEncode(bytes);

// ASPX часть
byte[] decodedBytes = HttpServerUtility.UrlTokenDecode(Request.QueryString["InvoiceData"]);
string decodedText = Encoding.UTF8.GetString(decodedBytes);
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721367
ShSerge
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
new_sergei,

Тогда воспользуйтесь самым простым средством - ломом и молотком браузером. Как я понял, там у Вас что-то типа документа. Возьмите свою нечитаемую строчку и вставьте её непосредственно в браузер, как дата-урл , только миме-тайп правильный напишите.
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721420
24spam@tut.by
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

У меня в Silverlight в списке всех доступных референсов отсутствует namepace System.Web, поэтому HttpServerUtility.UrlTokenEncode(bytes) я не могу выполнить. Как его подключить?
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721422
24spam@tut.by
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ShSerge,

Да, у меня на aspx передаётся по сути pdf, которая будет сформирована из этого xml.
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721593
Фотография SanSYS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да что может быть проще:
1. логируй что передаешь
2. логируй что получаешь (имеется ввиду Request["InvoiceData"])
3. сравни (хоть побайтно, Notepad++ (alt+d) & HEX Plugin, для него же, отлично помогут в этом)

результаты первых двух шагов выкладывай сюда в спойлере, если не разберешься )
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721943
bazile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
24spam@tut.byУ меня в Silverlight в списке всех доступных референсов отсутствует namepace System.Web, поэтому HttpServerUtility.UrlTokenEncode(bytes) я не могу выполнить. Как его подключить?
С Silverlight не работал, не знаю. Возможно что никак. Вот декомпилированный код функции UrlTokenEncode, попробуй его:
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
private static string UrlTokenEncode(byte[] input)
{
	if (input == null)
		throw new ArgumentNullException("input");
	if (input.Length < 1)
		return string.Empty;
	string str = Convert.ToBase64String(input);
	if (str == null)
		return (string)null;
	int length = str.Length;
	while (length > 0 && (int)str[length - 1] == 61)
		--length;
	char[] chArray = new char[length + 1];
	chArray[length] = (char)(48 + str.Length - length);
	for (int index = 0; index < length; ++index)
	{
		char ch = str[index];
		switch (ch)
		{
			case '+':
				chArray[index] = '-';
				break;
			case '/':
				chArray[index] = '_';
				break;
			case '=':
				chArray[index] = ch;
				break;
			default:
				chArray[index] = ch;
				break;
		}
	}
	return new string(chArray);
}



Вообще же тебе следует подумать о другом способе передачи данных т.к., как уже отметил ShSerge, длина данных передаваемых через query string ограничена. Рассчитывать можно примерно на 2Кб.
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37721997
24spam@tut.by
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
bazile,

Спасибо. Буду пробовать.
Но дело в том, что мне надо передать эту xml именно таким способом. Мне так сказал сделать мой начальник.
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37959117
Lion HC
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня похожая ситуация.
Нашли причину?
...
Рейтинг: 0 / 0
Недопустимая длина массива знаков Base-64
    #37959161
Starlex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lion HC,

такая ошибка случается, если в xml в качестве данных передать символы, например, ">" "<" "&". Нужно перед этим применять Server.HtmlEncode или что-то подобное.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / Недопустимая длина массива знаков Base-64
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]