转自:http://www.mgenware.com/blog/?p=220

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

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

//+ using System.Net;
//+ using System.IO;
static void Main(string[] args)
{
//创建HTTP请求
var request = (HttpWebRequest)WebRequest.Create("http://files.cnblogs.com/mgen/mgen_amalon.zip");
//从第3个到第12个字节,共10个字节。(0是第一个字节)
request.AddRange(, );
try
{
//获取HTTP回应,注意HttpWebResponse继承自IDisposable
using (var response = (HttpWebResponse)request.GetResponse())
{
if(response.StatusCode == HttpStatusCode.OK)
throw new Exception("文件不支持Range部分下载"); //设置接收信息的缓冲器
var bytes = new byte[];
Console.WriteLine("服务器回应:{0}", response.StatusCode);
Console.WriteLine("文件大小:{0}", humanReadableByteCount(response.ContentLength, false)); //获取回应的Stream(字节流)
using (var stream = response.GetResponseStream())
using (var outStream = new MemoryStream())
{
long recv = ;
int count;
//读取时注意实际接收数据大小
while ((count = stream.Read(bytes, , )) != )
{
Console.WriteLine("已经下载:{0}", humanReadableByteCount(recv += count, false));
//将接收数据写入
outStream.Write(bytes, , count);
}
//输出下载的内容
Console.WriteLine(BitConverter.ToString(outStream.ToArray())); }
}
}
catch (Exception ex)
{
Console.WriteLine("错误信息:{0}", ex.Message);
}
} //规格化输出大小的方法
//代码来自 / Original source
//http://stackoverflow.com/questions/3758606/how-to-convert-byte-size-into-human-readable-format-in-java
public static String humanReadableByteCount(long bytes, bool si)
{
int unit = si ? : ;
if (bytes < unit) return bytes + " B";
int exp = (int)(Math.Log(bytes) / Math.Log(unit));
String pre = (si ? "kMGTPE" : "KMGTPE")[exp - ] + (si ? "" : "i");
return String.Format("{0:F1} {1}B", bytes / Math.Pow(unit, exp), pre);
}

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

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

最新文章

  1. iOS学习之设计模式
  2. html5的一些表单属性。
  3. IRP IO_STACK_LOCATION 《寒江独钓》内核学习笔记(1)
  4. Oracle Study Note : Tablespace and Data Files
  5. Android layout的横竖屏处理
  6. 微信小程序前置课程:flex布局(二)
  7. FusionCharts生成报表应用
  8. SQLServer 数据库不能重命名的解决方案
  9. Scapy实现SYN泛洪攻击
  10. bzoj2237[NCPC2009]Flight Planning 结论题?
  11. HAProxy(二):HAProxy的ACL规则实现智能负载均衡详解与示例
  12. 【 HDU1081 】 To The Max (最大子矩阵和)
  13. VMware如何进入安全模式
  14. 《DSP using MATLAB》Problem 6.8
  15. RedHat7局域网下安装离线Ambari
  16. UDDI
  17. poi excel导入导出
  18. Android网络功能之会话发起协议SIP
  19. zookeeper 版本不一致导致不断重连
  20. EmailMessage类

热门文章

  1. sencha touch overlay 里使用 list
  2. C 标准库 - string.h之strstr使用
  3. Ajax介绍及爬取哔哩哔哩番剧索引追番人数排行
  4. HDU 5696 ——区间的价值——————【线段树、快排思想】
  5. 获取URL中某个参数的值
  6. invalid stream header: EFBFBDEF 问题解决
  7. Java---工欲善其事必先利其器(准备篇)
  8. SPDY和HTTP
  9. JBPM学习第6篇:通过Git导入项目
  10. PAT 1071. Speech Patterns