快速业务通道

ASP.NET中大文件下载的跟踪和恢复

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-05-20
自己的ASP.NET应用程序增加可靠的下载管理能力了。

获取下载过程的控制权的方法是从客户端截取下载请求、读取头信息并适当地响应。在。NET之前,你必须编写ISAPI(Internet服务器API)应用程序来实现这种功能,但是。NET框架组件提供了一个IHttpHandler接口,在类中实现的时候,它允许你仅仅使用。NET代码就能够截取和处理请求。这意味着你的应用程序对于下载过程有完全控制权和响应性,再也不会涉及或使用IIS的自动化函数。

示例代码在HttpHandler.vb文件中包含了一个自定义的HttpHandler类(ZIPHandler)。ZipHandler实现了IhttpHandler接口,并且处理对所有。zip文件的请求。

为了测试示例代码,你需要在IIS中建立一个新的虚拟目录,并把源文件复制到那儿。在该目录中建立一个叫做download.zip的文件(请注意IIS和ASP.NET不能处理大于2GB的下载,因此要确保你的文件没有超过该限制)。配置你的IIS虚拟目录,通过aspnet_isapi.dll映射。zip扩展名。

HttpHandler类:ZIPHandler

在ASP.NET中映射了。zip扩展名之后,客户端每次向服务器请求。zip文件的时候,IIS调用ZipHandler类的ProcessRequest方法(见下载代码)。

ProcessRequest方法首先建立自定义的FileInformation类(见下载代码)的一个实例,它封装了下载的状态(例如进行中、被中断了等等)。示例把download.zip示例文件的路径硬编码到代码中了。如果把这段代码应用于你自己的应用程序,需要修改它来打开被请求的文件。

'' 使用objRequest检测请求了哪个文件,用该文件打开objFile。
'' 例如objFile = New Download.FileInformation(<完整文件名>)
objFile = New Download.FileInformation( _
objContext.Server.MapPath("~/download.zip"))

接下来,程序使用描述的HTTP头信息(如果请求提供了头信息)执行一系列的验证检查。它把每种检查都封装在小型私有函数中,如果验证成功的话就返回True.如果某个验证检查失败了,响应会立即终止,并发送适当的StatusCode值。

If Not objRequest.HttpMethod.Equals(HTTP_METHOD_GET) Or Not
objRequest.HttpMethod.Equals(HTTP_METHOD_HEAD) Then
  '' 目前只支持GET和HEAD方法
  objResponse.StatusCode = 501 '' 没有执行
ElseIf Not objFile.Exists Then
  '' 无法找到被请求的文件
  objResponse.StatusCode = 404 '' 没有找到
ElseIf objFile.Length > Int32.MaxValue Then
  '' 文件太大了
  objResponse.StatusCode = 413 '' 请求实体太大
ElseIf Not ParseRequestHeaderRange(objRequest, alRequestedRangesBegin, alRequestedRangesend, _
objFile.Length, bIsRangeRequest) Then
  '' Range请求中包含无用的实体
  objResponse.StatusCode = 400 '' 无用的请求
ElseIf Not CheckIfModifiedSince(objRequest,objFile) Then
  '' 实体没有被修改过
  objResponse.StatusCode = 304 '' 没有被修改过
ElseIf Not CheckIfUnmodifiedSince(objRequest,objFile) Then
  '' 实体在上次被请求的日期之后被修改过
  objResponse.StatusCode = 412 '' 预处理失败
ElseIf Not CheckIfMatch(objRequest, objFile) Then
  '' 实体与请求不匹配
  objResponse.StatusCode = 412 '' 预处理失败
ElseIf Not CheckIfNoneMatch(objRequest, objResponse,objFile) Then
  '' 实体的确与none-match请求匹配。
  '' 响应代码位于CheckIfNoneMatch函数中
Else
  '' 初步检查成功

这些初步检查的函数中的ParseRequestHeaderRange(见下载代码)检查客户端是否请求了文件范围(这意味着是一个局部下载)。如果被请求的范围是无效的(无效范围指超越文件大小或包含不合理数字的范围数值),该方法把bIsRan

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号