2013-03-15 818 views
4

我在向Mandrill API發送JSON對象時遇到編碼問題。 向UTF8編碼的Streamwriter寫入時拋出以下異常:使用UTF8編碼的「要寫入流中的字節超過指定的內容長度字節大小」json

「要寫入流的字節超過指定的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值I仍然會得到相同的錯誤。

+1

UTF-8是可變長度編碼。字符數不一定等於字節數。你不能使用'json.Length'來設置'httpWebRequest.ContentLength'。 – Tomalak 2013-03-15 10:29:34

+0

您應該閱讀http://stackoverflow.com/a/1656741/18771,這將解決您的問題 – Tomalak 2013-03-15 10:38:34

回答

12

Content-Length必須以字節爲單位來指定,而不是char小號

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

^救生員。 – SmartK8 2013-12-04 14:03:11

相關問題