当前位置: 首页 > 图文教程 > 网络编程 > ASP.NET > 如何使用.NET实现断点续传功能

ASP.NET
不同映射模式下的直线输出的效果问题
ASP.NET开发下的MVC设计模式的实现
ASP.NET编写应用程序的十大技巧
ASP.NET中使用AJAX的简单方法
ASP.NET MVC实现自己的视图引擎
认识asp.net会话状态
ASP.NET实现页面传值的几种方法
.NET中容易混淆的几组重要概念
详解.NET中的动态编译技术
如何使用ASP.Net加密Cookie
ASP.NET 2.0跨网页提交的三种方法
ASP.NET 2.0创建母版页引来的麻烦
.Net整合其他平台的一些探讨
ASP.NET编程经验技巧10则
最佳实践 ADO.NET实用经验无保留曝光
在.NET上执行多线程操作要考虑的两大因素
.Net开发 细说Visual Basic.Net
ASP.NET网络编程中经常用到的27个函数集
ASP.NET防止用户多次登录的方法
对ASP.NET MVC项目中的视图做单元测试

ASP.NET 中的 如何使用.NET实现断点续传功能


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-23   浏览: 119 ::
收藏到网摘: n/a

顾名思义,断点续传就是在上一次下载时断开的位置开始继续下载。在HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。

断点续传的原理

在了解HTTP断点续传的原理之前,先来说说HTTP协议,HTTP协议是一种基于tcp的简单协议,分为请求和回复两种。请求协议是由客户机(浏览器)向服务器(WEB SERVER)提交请求时发送报文的协议。回复协议是由服务器(web server),向客户机(浏览器)回复报文时的协议。请求和回复协议都由头和体组成。头和体之间以一行空行为分隔。

以下是一个请求报文与相应的回复报文的例子

以下为引用的内容:
GET /image/index_r4_c1.jpg HTTP/1.1
Accept: */*
Referer: http://192.168.3.120:8080
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET             CLR 1.0.3705)
Host: 192.168.3.120:8080
Connection: Keep-Alive
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Tue, 24 Jun 2003 05:39:40 GMT
Content-Type: image/jpeg
Accept-Ranges: bytes
Last-Modified: Thu, 23 May 2002 03:05:40 GMT
ETag: "bec48eb862c21:934"
Content-Length: 2827
JFIF H H nbsp; C [1]
      ….

下面我们就来说说“断点续传”。

顾名思义,断点续传就是在上一次下载时断开的位置开始继续下载。在HTTP协议中,可以在请求报文头中加入Range段,来表示客户机希望从何处继续下载。

比如说从第1024字节开始下载,请求报文如下:

以下为引用的内容:
GET /image/index_r4_c1.jpg HTTP/1.1
Accept: */*
Referer: http://192.168.3.120:8080
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET             CLR 1.0.3705)
Host: 192.168.3.120:8080
Range:bytes=1024-
      Connection: Keep-Alive

.NET中的相关类

明白了上面的原理,那么,我们来看看。NET FRAMEWORK中为我们提供了哪些类可以来做这些事。

完成HTTP请求

System.Net.HttpWebRequest

HttpWebRequest 类对 WebRequest 中定义的属性和方法提供支持,也对使用户能够直接与使用 HTTP 的服务器交互的附加属性和方法提供支持。

HttpWebRequest 将发送到 Internet 资源的公共 HTTP 标头值公开为属性,由方法或系统设置。下表包含完整列表。可以将 Headers 属性中的其他标头设置为名称/值对。但是注意,某些公共标头被视为受限制的,它们或者直接由 API公开,或者受到系统保护,不能被更改。Range也属于被保护之列,不过,。NET为开发者提供了更方便的操作,就是 AddRange方法,向请求添加从请求数据的开始处或结束处的特定范围的字节范围标头。

完成文件访问

System.IO.FileStream

FileStream 对象支持使用Seek方法对文件进行随机访问, Seek 允许将读取/写入位置移动到文件中的任意位置。这是通过字节偏移参考点参数完成的。字节偏移量是相对于查找参考点而言的,该参考点可以是基础文件的开始、当前位置或结尾,分别由SeekOrigin类的三个属性表示。

代码实现

了解了。NET提供的相关的类,那么,我们就可以方便的实现了。

代码如下:

以下为引用的内容:
static void Main(string[] args)
{
 string StrFileName="c:\\aa.zip"; //根据实际情况设置
  string StrUrl="http://www.xxxx.cn/xxxxx.zip"; //根据实际情况设置
 //打开上次下载的文件或新建文件
 long lStartPos =0;
 System.IO.FileStream fs;
 if (System.IO.File.Exists(StrFileName))
 {
 fs= System.IO.File.OpenWrite(StrFileName);
 lStartPos=fs.Length;
 fs.Seek(lStartPos,System.IO.SeekOrigin.Current); //移动文件流中的当前指针
 }
 else
 {
  fs = new System.IO.FileStream(StrFileName,System.IO.FileMode.Create);
 lStartPos =0;
 }
 //打开网络连接
  try
 {
 System.Net.HttpWebRequest request =(System.Net.HttpWebRequest)System.Net.                                     HttpWebRequest.Create(StrUrl);
 if ( lStartPos>0)
 request.AddRange((int)lStartPos); //设置Range值
 //向服务器请求,获得服务器回应数据流
 System.IO.Stream ns= request.GetResponse().GetResponseStream();
 byte[] nbytes = new byte[512];
 int nReadSize=0;
 nReadSize=ns.Read(nbytes,0,512);
 while( nReadSize >0)
 {
 fs.Write(nbytes,0,nReadSize);
 nReadSize=ns.Read(nbytes,0,512);
 }
 fs.Close();
 ns.Close();
 Console.WriteLine("下载完成");
 }
 catch(Exception ex)
 {
 fs.Close();
 Console.WriteLine("下载过程中出现错误:"+ex.ToString());
 }
       }