0

我需要获取内容长度才能告诉我的应用程序缓冲区在哪里结束。问题是 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();

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

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

<tag1><tag2><tag3> ag3> 

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

4

1 回答 1

7

-1 不是ContentLength属性的无效值。我假设您的意思是响应ContentLength的属性是-1 ...询问请求的长度是没有意义的。即便如此,它也是完全有效的:

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

如果正文长度为 1850,则表明它正在使用分块传输编码。但这对您来说应该是透明的 - 只需继续从响应流中读取直到结束。如果您使用的是 .NET 4,这非常简单 - 只需创建一个MemoryStream并使用Stream.CopyTo将数据复制到该MemoryStream.

于 2012-02-26T22:38:17.083 回答