“要写入流的字节超过指定的内容长度字节大小”,使用UTF8编码的json

时间:2013-03-15 10:26:33

标签: json utf-8 mandrill

我在向Mandrill API发送JSON对象时遇到编码问题。 在使用UTF8编码写入流写器时,会抛出以下异常:

“要写入流的字节超过指定的Content-Length字节大小。” 以及之后: “在写入所有字节之前无法关闭流。”

这是用于发送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值加倍,我仍然会得到相同的错误。

1 个答案:

答案 0 :(得分:13)

必须以字节为单位指定Content-Length,而不是char s

var json = Encoding.UTF8.GetString(ms.ToArray());
httpWebRequest.ContentLength = Encoding.UTF8.GetByteCount(json);
相关问题