【问题标题】:"Bytes to be written to the stream exceed the Content-Length bytes size specified" with UTF8 encoded json“要写入流的字节超过指定的 Content-Length 字节大小”,使用 UTF8 编码的 json
【发布时间】:2013-03-04 00:29:14
【问题描述】:

我在向 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 值加倍,我仍然会得到同样的错误。

【问题讨论】:

  • UTF-8 是一种可变长度编码。字符数不一定等于字节数。不能使用json.Length 设置httpWebRequest.ContentLength
  • 你应该阅读stackoverflow.com/a/1656741/18771,这将解决你的问题

标签: json utf-8 mandrill


【解决方案1】:

Content-Length 必须以字节为单位,而不是chars

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多