HttpWebRequest无效的contentlength

use*_*551 0 c# httpwebrequest content-length

我需要获取内容长度,以告诉我的应用程序缓冲区结束的位置.问题是httpwebresponse.ContentLength返回-1,即使在响应中显示Content-Length标头.

然后我虽然我要读实际的标题来找出长度.我正在测试的页面返回的Content-Length是1646.一个HTTP嗅探器声称我收到了1900个字节,所以我假设差异是标题长度.然后我从响应中复制了整个身体并将其粘贴到在线strlen网站上,体型实际上是1850!

这怎么可能?为什么响应返回无效的内容长度,为什么httpwebrequest.ContentLength返回-1?如何在收到响应之前计算实际响应长度?

编辑:这是我用来获得响应的代码:

                  using (System.IO.Stream responseStream = hwresponse.GetResponseStream())
                  {
                      using (MemoryStream memoryStream = new MemoryStream())
                      {
                          int count = 0;
                          do
                          {
                              count = responseStream.Read(buffer, 0, buffer.Length);
                              TCP_R.SendBytes(buffer);

                          } while (count != 0);

                      }
                  }

                  byte[] PACKET_END_IDENTIFIER = { 0x8, 0x01, 0x8, 0x1, 0x8 };
                  TCP_R.SendBytes(PACKET_END_IDENTIFIER);
                  TCP_R.Close();
Run Code Online (Sandbox Code Playgroud)

我有一个代理服务器应用程序接收请求,将其发送到另一个应用程序(我的客户端)客户端执行请求并使用TCP_R类返回结果.当服务器从客户端获得响应时,它会将响应返回给浏览器.

每次我做一个请求,我得到所有的数据+额外的垃圾,这是一个例子:

<tag1><tag2><tag3> ag3> 
Run Code Online (Sandbox Code Playgroud)

ag3>是垃圾数据,它就像缓冲区的结尾被切断并再次添加.它显示客户端响应有效响应,垃圾数据添加onDataRecieve事件..任何提示?谢谢!

Jon*_*eet 7

-1不是ContentLength属性的无效值.我假设你的意思是响应ContentLength属性是-1 ...询问请求长度是非感性的.即使这样,它也完全有效:

ContentLength属性包含随响应返回的Content-Length标头的值.如果未在响应中设置Content-Length标头,则ContentLength将设置为值-1.

如果体长是1850,那表明它使用的是分块传输编码.但这对您来说应该是透明的 - 只需继续阅读响应流直到结束.如果你使用的是.NET 4,那就很简单 - 只需创建一个MemoryStream并使用Stream.CopyTo将数据复制到那里MemoryStream.

  • 您对responseStream.Read的调用将返回您在变量"count"中保存的值.该值表示Read函数实际写入字节数组的字节数.但是,当您在下一行代码上发送数据时,您将发送整个字节数组.您应该在那里添加对"count"变量的引用.这就是@JonSkeet所说的 (3认同)