Я сталкиваюсь с проблемами с кодировкой при отправке объекта 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 по-прежнему получают ту же ошибку.
UTF-8 представляет собой кодирование с переменной длиной. Число символов не обязательно равно числу байтов. Вы не можете использовать 'json.Length' для установки' httpWebRequest.ContentLength'. – Tomalak
Вы должны прочитать http://stackoverflow.com/a/1656741/18771, это решит вашу проблему. – Tomalak