2013-03-15 3 views
4

Я сталкиваюсь с проблемами с кодировкой при отправке объекта JSON в API Mandrill. При записи в потоковик с кодировкой UTF8 выбрано следующее исключение:«Байты, которые должны быть записаны в поток, превышают указанный размер байтов длины содержимого» с кодировкой UTF8 json

«Байты, которые должны быть записаны в поток, превышают указанный размер байтов длины содержимого». и сразу после: «Невозможно закрыть поток, пока не будут записаны все байты».

Это часть кода используется для передачи объекта JSON:

var httpWebRequest = (HttpWebRequest)WebRequest.Create(mandrillUrl + "/messages/send.json"); 
httpWebRequest.ContentType = "application/json"; 
httpWebRequest.Method = "POST"; 
var ser = new DataContractJsonSerializer(wrapper.GetType()); 
var ms = new MemoryStream(); 
ser.WriteObject(ms, wrapper); 

var json = Encoding.UTF8.GetString(ms.ToArray()); 
httpWebRequest.ContentLength = json.Length; 
var stream = httpWebRequest.GetRequestStream(); 

using (var strWriter = new StreamWriter(stream, Encoding.UTF8)) 
{ 
strWriter.Write(json); 
} 

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) 
{ 
var responseText = streamReader.ReadToEnd(); 
} 

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

+1

UTF-8 представляет собой кодирование с переменной длиной. Число символов не обязательно равно числу байтов. Вы не можете использовать 'json.Length' для установки' httpWebRequest.ContentLength'. – Tomalak

+0

Вы должны прочитать http://stackoverflow.com/a/1656741/18771, это решит вашу проблему. – Tomalak

ответ

12

Content-Length должен быть указан в байтах, а не char с

var json = Encoding.UTF8.GetString(ms.ToArray()); 
httpWebRequest.ContentLength = Encoding.UTF8.GetByteCount(json); 
+0

^Life-saver. – SmartK8

Смежные вопросы