博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NET(C#):使用HttpWebRequest头中的Range下载文件片段
阅读量:6967 次
发布时间:2019-06-27

本文共 1976 字,大约阅读时间需要 6 分钟。

HTTP请求包头信息中有一个Range属性可以指定索取部分HTTP请求的文件。在.NET中则通过HttpWebRequest.AddRange方法来定义数据的范围。

当添加了Range属性的HTTP请求发送后,如果服务器支持该请求,也就是说支持部分数据提取(也是我们常说到的支持断点续传的下载,所谓断点续传的下载就是用一个Range属性来指定没有下载到的范围),那么服务器会返回Partial Content状态值(206代码)。否则会返回OK状态值(200代码)。注意如果服务器支持Range但是HTTP Range请求的范围超出了文件范围,则服务器会返回RequestedRangeNotSatisfiable状态值(416代码)。

 

[csharp] 
 
 
  1. //+ using System.Net;  
  2. //+ using System.IO;  
  3. static void Main(string[] args)  
  4. {  
  5.     //创建HTTP请求  
  6.     var request = (HttpWebRequest)WebRequest.Create("http://files.cnblogs.com/mgen/mgen_amalon.zip");  
  7.     //从第3个到第12个字节,共10个字节。(0是第一个字节)  
  8.     request.AddRange(2, 11);  
  9.     try  
  10.     {  
  11.         //获取HTTP回应,注意HttpWebResponse继承自IDisposable  
  12.         using (var response = (HttpWebResponse)request.GetResponse())  
  13.         {  
  14.             if(response.StatusCode == HttpStatusCode.OK)  
  15.                 throw new Exception("文件不支持Range部分下载");  
  16.   
  17.             //设置接收信息的缓冲器  
  18.             var bytes = new byte[5000];  
  19.             Console.WriteLine("服务器回应:{0}", response.StatusCode);  
  20.             Console.WriteLine("文件大小:{0}", humanReadableByteCount(response.ContentLength, false));  
  21.   
  22.             //获取回应的Stream(字节流)  
  23.             using (var stream = response.GetResponseStream())  
  24.             using (var outStream = new MemoryStream())  
  25.             {  
  26.                 long recv = 0;  
  27.                 int count;  
  28.                 //读取时注意实际接收数据大小  
  29.                 while ((count = stream.Read(bytes, 0, 5000)) != 0)  
  30.                 {  
  31.                     Console.WriteLine("已经下载:{0}", humanReadableByteCount(recv += count, false));  
  32.                     //将接收数据写入  
  33.                     outStream.Write(bytes, 0, count);  
  34.                 }  
  35.                 //输出下载的内容  
  36.                 Console.WriteLine(BitConverter.ToString(outStream.ToArray()));  
  37.   
  38.             }  
  39.         }  
  40.     }  
  41.     catch (Exception ex)  
  42.     {  
  43.         Console.WriteLine("错误信息:{0}", ex.Message);  
  44.     }  
  45. }  
  46.   
  47. //规格化输出大小的方法  
  48. //代码来自 / Original source  
  49. //http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java  
  50. public static String humanReadableByteCount(long bytes, bool si)  
  51. {  
  52.     int unit = si ? 1000 : 1024;  
  53.     if (bytes < unit) return bytes + " B";  
  54.     int exp = (int)(Math.Log(bytes) / Math.Log(unit));  
  55.     String pre = (si ? "kMGTPE" : "KMGTPE")[exp - 1] + (si ? "" : "i");  
  56.     return String.Format("{0:F1} {1}B", bytes / Math.Pow(unit, exp), pre);  
  57. }  

 

 

中间的十个数据会被下载:

如果尝试不支持Range部分下载的文件,比如普通HTTP的GET请求指定网址的网页。程序则会输出“文件不支持Range部分下载”。

转载地址:http://dxisl.baihongyu.com/

你可能感兴趣的文章
快速解决eclipse/myeclipse下的tomcat服务器端口号8080被占用的简单方法
查看>>
虚拟局域网VLAN
查看>>
查看jvm 内存使用情况的小工具(jdk自带)
查看>>
第1课:SparkStreaming 三板斧之一:解密SparkStreaming另类实验及SparkStreaming本质解析...
查看>>
我的友情链接
查看>>
UI设计网站
查看>>
企业级分布式监控系统Zabbix系列之02(Zabbix-Agent安装与配置)
查看>>
项目管理实施流程(六)集成测试和系统测试
查看>>
利用awk i=!i 来输出奇偶行详解
查看>>
服务器nginx 用shell 统计并发
查看>>
Eclipse插件安装--通用方法
查看>>
iframe高度自适应的方法
查看>>
对素数的判断和素数个数的判断
查看>>
【iOS编程思想】ReactiveCocoa (6) 多次订阅一次请求
查看>>
Redis 集群原理与使用
查看>>
TP之msubstr()
查看>>
MySQL的MyISAM和InnoDB对比及优化
查看>>
mysql proxy、mysql-mmm实现读写分离高可用性
查看>>
星河时空尽头的我没理由放弃挨打的痛苦
查看>>
hibernate多对多关系
查看>>