Ошибка отправки строки в кодировке base64 через HTTP с помощью .NET - PullRequest
2 голосов
/ 20 августа 2010

Хорошо, проблема в том, что я пытаюсь отправить байтовый массив через HTTP, закодированный как base64. Хотя полученная мной строка на другом конце имеет такой же размер, как и исходная строка, сами строки не идентичны, поэтому я не могу декодировать строку обратно в исходный байтовый массив.

Кроме того, перед отправкой строки я выполнил преобразование в / из base64 на стороне клиента, и все работает нормально. Проблема возникает после отправки.

Есть что-то, что я пропускаю? Какой-то конкретный тип форматирования? Я пытался использовать EscapeData (), но строка слишком велика.

Заранее спасибо

изменить: код

System.Net.WebRequest rq = System.Net.WebRequest.Create("http://localhost:53399/TestSite/Default.aspx");
rq.Method = "POST";
rq.ContentType = "application/x-www-form-urlencoded";
string request = string.Empty;
string image =             Convert.ToBase64String(System.IO.File.ReadAllBytes("c:\\temp.png"));            
request += "image=" + image;
int length = image.Length;
byte[] array = new UTF8Encoding().GetBytes(request);
rq.ContentLength = request.Length;
System.IO.Stream str = rq.GetRequestStream();                        
str.Write(array, 0, array.Length);            
System.Net.WebResponse rs = rq.GetResponse();
System.IO.StreamReader reader = new System.IO.StreamReader(rs.GetResponseStream());
string response = reader.ReadToEnd();
reader.Close();
str.Close();            
System.IO.File.WriteAllText("c:\\temp\\response.txt", response);

Ответы [ 2 ]

5 голосов
/ 20 августа 2010

Вторая строка ниже - это проблема.

string image = Convert.ToBase64String(System.IO.File.ReadAllBytes("c:\temp.png")); request += "image=" + image;

Если вы посмотрите на индексную таблицу Base 64 , последние два символа (+ и /) НЕ являются URL-безопасными. Поэтому, когда вы добавляете его к запросу, вы ДОЛЖНЫ URL кодировать изображение.

Я не парень .net, но вторая строка должна быть написана примерно так string image = Convert.ToBase64String(System.IO.File.ReadAllBytes("c:\temp.png")); request += "image=" + URLEncode(image);

Никаких изменений на стороне сервера не требуется. Просто узнайте, что системный вызов URL для кодирования фрагмента строки.

0 голосов
/ 20 августа 2010

Я предложу две вещи, чтобы попробовать

  1. Включите кодировку в тип контента, поскольку вы полагаетесь на UTF8 -

    rq.ContentType = "application / x-www-form-urlencoded; charset = utf-8"

  2. Используйте StreamWriter для записи в поток запросов, так как вы используете StreamReader для его чтения.

...