A-A+

HttpWebRequest-gzip和deflate的处理

2014年11月24日 技术 暂无评论 阅读 4,079 次

当返回的数据较大时,有的站点开启了数据压缩,在使用HttpWebRequest时,需要注意这一点,只有正常的解压后才能获得数据主体,否则会产生乱码。

如何开启数据压缩?需要在Http请求的头部加入数据压缩指令,再使用HttpWebRequest时,编码如下:

  1. request.Headers.Add("Accept-Encoding""gzip");

如果目标站点支持数据压缩,则会返回相应的数据流。使用火狐开发工具,对启用了数据压缩站点的请求进行跟踪,如下:

request 站点的响应头部会如下所示:

response
可以看到,如果站点开启了数据压缩,则会有明显的标识,我们在解析返回流时就需要注意这点。下面这段函数可以帮助我们解析返回的数据流:

  1. using System.IO.Compression;
  2. private string GetResponseBody(HttpWebResponse response)
  3. {
  4.         string result = string.Empty;
  5.         if (response.ContentEncoding.ToLower().Contains("gzip"))
  6.         {
  7.                 using (GZipStream stream = new GZipStream(
  8.                     response.GetResponseStream(), CompressionMode.Decompress))
  9.                 {
  10.                         using (StreamReader reader = new StreamReader(stream))
  11.                         {
  12.                                 result = reader.ReadToEnd();
  13.                         }
  14.                 }
  15.         }
  16.         else if (response.ContentEncoding.ToLower().Contains("deflate"))
  17.         {
  18.                 using (DeflateStream stream = new DeflateStream(
  19.                     response.GetResponseStream(), CompressionMode.Decompress))
  20.                 {
  21.                         using (StreamReader reader =
  22.                                 new StreamReader(stream, Encoding.UTF8))
  23.                         {
  24.                                 result = reader.ReadToEnd();
  25.                         }
  26.                 }
  27.         }
  28.         else
  29.         {
  30.                 using (Stream stream = response.GetResponseStream())
  31.                 {
  32.                         using (StreamReader reader =
  33.                                 new StreamReader(stream, Encoding.UTF8))
  34.                         {
  35.                                 result = reader.ReadToEnd();
  36.                         }
  37.                 }
  38.         }
  39.         return result;
  40. }

给我留言

Copyright © 字痕随行 保留所有权利.   Theme  Ality

用户登录

分享到: