准备工作:

通过 NUGET 安装 Microsoft.Bcl.Compression ;

使用命名空间

using System.IO.Compression ;

  1. public static async Task<string> Get(string url)
  2. {
  3. WebRequest request = WebRequest.CreateHttp(new Uri(url)); //创建WebRequest对象
  4. request.Method = "GET"; //设置请求方式为GET
  5. request.Headers[HttpRequestHeader.UserAgent] = "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0";
  6. request.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate"; //设置接收的编码 可以接受 gzip
  7.  
  8. var response = await request.GetResponseAsync();
  9. Stream stream = null;
  10. stream = response.Headers[HttpRequestHeader.ContentEncoding].Equals("gzip",
  11. StringComparison.CurrentCultureIgnoreCase) ? new GZipStream(response.GetResponseStream(), CompressionMode.Decompress) : response.GetResponseStream();
  12. var ms = new MemoryStream();
  13. var buffer = new byte[];
  14. while (true)
  15. {
  16. if (stream == null) continue;
  17. var sz = stream.Read(buffer, , );
  18. if (sz == ) break;
  19. ms.Write(buffer, , sz);
  20. }
  21. var bytes = ms.ToArray();
  22. var html = GetEncoding(bytes, response.Headers[HttpRequestHeader.ContentType]).GetString(bytes);
  23. await stream.FlushAsync();
  24. return html;
  25.  
  26. }

获取编码:

  1. public static Encoding GetEncoding(byte[] bytes, string charSet)
  2. {
  3. var html = Encoding.UTF8.GetString(bytes);
  4. var regCharset = new Regex(@"charset\b\s*=\s*""*(?<charset>[^""]*)");
  5. if (regCharset.IsMatch(html))
  6. {
  7. return Encoding.GetEncoding(regCharset.Match(html).Groups["charset"].Value);
  8. }
  9. if (string.IsNullOrEmpty(charSet))
  10. {
  11. return Encoding.UTF8;
  12. }
  13. try
  14. {
  15. // 解决 gbk gb2312
  16. Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
  17. return Encoding.GetEncoding(charSet);
  18. }
  19. catch (Exception)
  20. {
  21. return Encoding.UTF8;
  22. }
  23. }

虽然使用 HttpClient 更简单

  1. var http = new HttpClient();
  2. http.DefaultRequestHeaders.Add("user-agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0");
  3. http.DefaultRequestHeaders.Add("accept-encoding", "gzip, deflate");
  4. var response = await http.GetAsync(new Uri(url));
  5. response.EnsureSuccessStatusCode();//确保请求成功

但是它的响应头并没有 “Content-Encoding” ,所以无法直接判断需不需要 Gzip 解压。

UWP 解压 GZIP的更多相关文章

  1. curl解压gzip页面gzcompress内容

    $headers = array( //"Content-type:application/json;charset='utf-8'", "Cache-Control:n ...

  2. 解压gzip格式文件(包括网页)

    先上源码 参数说名: - source :gzip格式流内容. - len: gzip流长度 - dest: 解压后字符流指针 - gzip: 压缩标志,非0时解压gzip格式,否则按照zip解压 说 ...

  3. HttpWebResponse 解压gzip、deflate压缩

    需要使用到两个Stream的子类:GZipStream.DeflateStream,代码如下: public string GetResponseBody(HttpWebResponse respon ...

  4. C# 解压gzip文件(.tgz)

    1.引用 SharpCompress.dll 2.代码 using System;using System.IO;using System.Text;using SharpCompress.Reade ...

  5. httplib 和 httplib2区别之 gzip解压

    HTTP请求头Accept-encoding: gzip信息告诉服务器,如果它有任何新数据要发送给时,请以压缩的格式发送.如果服务器支持压缩,它将返回由 gzip 压缩的数据并且使用Content-e ...

  6. 压缩及解压命令gzip、bzip2、tar

    1. gzip 描述:压缩与解压缩 用法:gzip[选项]...[文件名称]... 选项:-d 解压 gzip hello.txt     # 文件压缩后名为hello.txt.gz gzip -d ...

  7. *.tar 用 tar –xvf 解压 *.gz 用 gzip -d或者gunzip 解压 *.tar.gz和*.tgz 用 tar –xzf 解压 *.bz2 用 bzip2 -d或者用bunzip2 解压 、*.tar.bz2用tar –xjf 解压

    解压: 1.*.tar 用 tar –xvf 解压, --skip-old-files跳过已经存在的文件,压缩用tar -cvf 2.*.bz2 用 bzip2 -d或者用bunzip2 解压 3.* ...

  8. GZip 压缩解压 工具类 [ GZipUtil ]

    片段 1 片段 2 pom.xml <dependency> <groupId>commons-codec</groupId> <artifactId> ...

  9. [Linux] 解压tar.gz文件,解压部分文件

    遇到数据库无法查找问题原因,只能找日志,查找日志的时候发现老的日志都被压缩了,只能尝试解压了   数据量比较大,只能在生产解压了,再进行查找 文件名为*.tar.gz,自己博客以前记录过解压方法: h ...

随机推荐

  1. [Java] JDK 系统环境变量设置 bat

    @echo off set regpath=HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environmen ...

  2. 【读书笔记】iOS-UIWindow-WindowLevel

    WindowLevel是UIWindow的一个属性.系统定义的一共有3种. UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; UIKIT_EX ...

  3. C语言-11-可变参数的实现方案

    概述 某种情况下,我们可能需要一个具有可变参数的函数,C语言提供了一种标准的实现可变参数的方法 C语言实现可变参数的方案是基于标准库的 可变参数的类型 可变参数可以放在一个集合中,可以使用指针类型的参 ...

  4. iOS开发之网络编程--使用NSURLConnection实现大文件下载

    主要思路(实现下载数据分段写入缓存中) 1.使用NSURLConnectionDataDelegate以及代理方法.2.在成功获取响应的代理方法中,获得沙盒全路径,并在该路径下创建空文件和文件句柄.3 ...

  5. [转]个人源码管理:如何在本机配置自己的SVN Repository (图解)

    本文转自:http://blog.csdn.net/wikijava/article/details/6245588 Repository 即源码的集中存放处,所有修改后提交的源码就是保存在这里,并在 ...

  6. Erlang数据类型的表示和实现(4)——boxed 对象

    Boxed 对象 Boxed 对象是比较复杂的对象,在 Erlang 中主标签为 10 的 Eterm 表示一个对 boxed 对象的引用.这个 Eterm 除去标签之后剩下的实际上是一个指针,指向具 ...

  7. EF+MVC+cod First项目性能优化总结

    1.EF:this.Configuration.UseDatabaseNullSemantics = true; //关闭数据库null比较行为 2.实体必填字段要加:[Required]属性,可定长 ...

  8. SharePoint 指定配置数据库访问账户“域账户\用户”

    大家在安装sharepoint时都会遇到这个问题,域账户,什么是域账户哪?域账户简单理解就是网路账户,与本地账户不同,什么是域哪?域就是控制器. 一台Windows 计算机,它要么隶属于工作组,要么隶 ...

  9. Button未设type属性时在非IE6/7中具有submit特性

    代码如下 <!DOCTYPE html> <html> <head> <title>Button在Form中具有submit的特性</title& ...

  10. poj 3177 Redundant Paths

    题目链接:http://poj.org/problem?id=3177 边双连通问题,与点双连通还是有区别的!!! 题意是给你一个图(本来是连通的),问你需要加多少边,使任意两点间,都有两条边不重复的 ...