4

JSON オブジェクトを Mandrill API に送信する際に、エンコードの問題に直面しています。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 の値を 2 倍にしても同じエラーが発生します。

4

1 に答える 1

14

は、 sContent-Lengthではなくバイト単位で指定する必要がありますchar

var json = Encoding.UTF8.GetString(ms.ToArray());
httpWebRequest.ContentLength = Encoding.UTF8.GetByteCount(json);
于 2013-03-15T11:52:50.617 に答える