HttpWebRequest请求http1.1的chunked的解析问题记录

问题:我的请求获取不到URL对应的内容(换个浏览器可以)。

 

第一步对比wirshark截包看HTTP请求头,发现我这缺失一部分请求头。

对着官方文档添加即可。https://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest(v=vs.110).aspx

第二步,校正请求头后请求后,发现wireshark有返回,但是无法获取。debug发现无法解析内容。

这个地方可能会耗费一点时间和经验才能知道。

经过目测,发现这个网站是HTTP1.1 ,还有一个参数chunked。简单说就是返回内容的时候,分段返回的。不设置长度。

老版本的读取方法的话,对于这种是没法读取的。参考另一个网友的办法就解决了。

供大家参考吧。自己项目代码就不贴了,避嫌。

static void Main(string[] args)
        {
            HttpWebResponse web = MySpider.GetResponse("http://localhost:1853/WebForm1.aspx");
            DecompressGZip(web );
            Console.ReadLine();
        }
 
public static MemoryStream DecompressGZip(HttpWebResponse res)
    {

  

 //如果服务器使用了Transfer-Encoding:chunked缓冲输出,则只要服务器端Flush了,就会触发此方法,而不是等到服务器发送过来的内容全部发送完才触发,
//而且与是不是异步HttpWebRequest请求也没有关系。相反,如果服务器没有使用Transfer-Encoding:chunked缓冲输出,
//则不管是异步HttpWebRequest请求还是同步HttpWebRequest请求,都得等到服务器发送过来的内容全部发送完才触发此方法。
Stream stream = res.GetResponseStream(); int length = 0; if (res.ContentLength > 0) { length = (int)res.ContentLength; } else { length = 3000; } MemoryStream memory = new MemoryStream(length); int count = 0; //每次从服务器返回流中读取5000个字节 byte[] buffer = new byte[5000]; while (true) {        //如果服务器使用了Transfer-Encoding:chunked缓冲输出,则如果已经读取了服务器第一次Flush的内容后服务器第二次Flush的内容还没有接收到,则会阻塞当前线程,
//直到接收到服务器第二次Flush的内容(第三,四。。。次Flush也是一样),所以很可能会造成读取一次返回的count不满5000,但下一次继续读取返回的count却不是0的情况
count = stream.Read(buffer, 0, buffer.Length); if (count == 0) { break; } memory.Write(buffer, 0, count); } stream.Close(); //将流的可读位置设置到起始值 memory.Seek(0, SeekOrigin.Begin); return memory; }

 

 

 

 

附录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: HttpWebRequest是一个.NET Framework中的类,用于向Web服务器发送HTTP请求请求正文是指在HTTP请求中发送的数据,通常是POST请求中的表单数据或JSON数据等。可以使用HttpWebRequest的GetRequestStream方法获取请求正文流,然后将数据写入流中发送到服务器。在接收服务器响应时,可以使用HttpWebRequest的GetResponse方法获取响应流,然后从流中读取响应正文。 ### 回答2: HttpWebRequest请求是通过发送HTTP协议包的形式与WebServer进行通信,用于向Web服务器发送请求并获取响应。请求正文是HttpWebRequest请求中的一部分,负责传递与请求相关的数据。对于一些Web应用场景,经常需要使用请求正文来进行数据的传输,例如上传文件、提交表单数据等。 请求正文的构造主要有两种方式:表单方式和流方式。表单方式主要用于发送数据量较小的请求,可以直接通过HttpWebRequest的GetRequestStream()方法获取请求流,然后将表单数据转换为字节数组写入请求流中即可。在请求表单中我们经常使用键值对的形式传递数据。 每个请求必须有一个有效的Content-Length头,它指定请求body的字节数(除了multipart/form-data,你也可以这样expression,因为它有multipart的请求边界). 所以在表单中必须要指定Content-Length. 因为Web服务器会根据Content-Length来判断请求是否已经完整接收到,并在已接收到完整请求之后才会开始处理请求,并返回相应的响应数据,否则请求将被认为是不完整的并被拒绝。 流方式则主要用于发送数据量较大的请求,例如文件上传和下载。在流方式的请求中,需要获取HttpWebRequest的GetRequestStream()方法返回的请求流,然后将上传文件的字节流写入请求流中,实际上这个操作也是以字节数组的形式将数据写入请求流中,只不过字节数组的内容从表单数据转换为文件字节流。 总之,请求正文在HttpWebRequest请求中起着至关重要的作用,负责传输数据和携带相关的参数信息,我们在进行HttpWebRequest开发时,可以根据具体的应用场景选择合适的构造方式进行请求数据的传输。同时,我们也需要注意请求的完整性和正确性,保证请求正文中的数据与实际需要传输的数据保持一致。 ### 回答3: HttpWebRequest请求正文是指在发送HTTP请求时,需要发送的数据内容。通常,发送HTTP请求的时候,需要向服务器发送一些数据,比如表单数据、XML数据、JSON数据等等。这些数据需要封装在请求的正文中发送。 在使用HttpWebRequest发送POST请求时,需要将请求的数据存储在请求的正文中。HttpWebRequest提供了多种方法来设置请求的正文,包括设置请求正文的内容类型、设置字符编码、设置数据流等。下面是常用方法的介绍: 1.设置请求正文的内容类型 使用HttpWebRequest的ContentType属性来设置请求正文的内容类型,常见的内容类型包括application/x-www-form-urlencoded、application/json、text/xml等。 2.设置字符编码 发送POST请求时,需要将请求正文的数据编码成字节数组。使用Encoding类来进行字符编码。 3.设置请求正文数据流 使用HttpWebRequest的GetRequestStream方法获取请求正文对应的数据流,通过读写数据流来设置请求正文。 综上所述,请求正文是HTTP请求中必不可少的一部分,HttpWebRequest提供了多种方法来设置请求正文,以满足不同的需求。在使用HttpWebRequest发送HTTP请求时,需要了解如何设置请求正文,以确保请求能够成功发送和处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值