错误(HttpWebRequest):要写入流的字节数超过指定的Content-Length字节大小
我似乎无法弄清楚为什么我一直收到以下错误:
Bytes to be written to the stream exceed the Content-Length bytes size specified.
在以下行:
writeStream.Write(bytes, 0, bytes.Length);
这是在Windows窗体项目上。 如果有人知道这里发生了什么,我肯定欠你一个。
private void Post() { HttpWebRequest request = null; Uri uri = new Uri("xxxxx"); request = (HttpWebRequest)WebRequest.Create(uri); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; XmlDocument doc = new XmlDocument(); doc.Load("XMLFile1.xml"); request.ContentLength = doc.InnerXml.Length; using (Stream writeStream = request.GetRequestStream()) { UTF8Encoding encoding = new UTF8Encoding(); byte[] bytes = encoding.GetBytes(doc.InnerXml); writeStream.Write(bytes, 0, bytes.Length); } string result = string.Empty; request.ProtocolVersion = System.Net.HttpVersion.Version11; request.KeepAlive = false; try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { using (Stream responseStream = response.GetResponseStream()) { using (System.IO.StreamReader readStream = new System.IO.StreamReader(responseStream, Encoding.UTF8)) { result = readStream.ReadToEnd(); } } } } catch (Exception exp) { // MessageBox.Show(exp.Message); } }
有三种可能的选择
-
修复ContentLength,如@rene的答案所述
-
不要设置ContentLength,HttpWebRequest正在缓冲数据,并自动设置ContentLength
-
将SendChunked属性设置为true,并且不设置ContentLength。 该请求被发送块编码到Web服务器。 (需要HTTP 1.1并且必须得到网络服务器的支持)
码:
... request.SendChunked = true; using (Stream writeStream = request.GetRequestStream()) { ... }
InnerXml中的编码字节数组可能会更长,因为UTF8编码中的某些字符占用单个字符的2或3个字节。
更改您的代码如下:
using (Stream writeStream = request.GetRequestStream()) { UTF8Encoding encoding = new UTF8Encoding(); byte[] bytes = encoding.GetBytes(doc.InnerXml); request.ContentLength = bytes.Length; writeStream.Write(bytes, 0, bytes.Length); }
要准确显示正在发生的事情,请在LINQPad中尝试:
var s = "é"; s.Length.Dump("string length"); Encoding.UTF8.GetBytes(s).Length.Dump("array length");
这将输出:
string length: 1 array length: 2
现在使用没有撇号的e
:
var s = "e"; s.Length.Dump("string length"); Encoding.UTF8.GetBytes(s).Length.Dump("array length");
这将输出:
string length: 1 array length: 1
请记住:字符串长度和特定编码所需的字节数可能不同。