A.NET 中大文件下载的跟踪和恢复(3)_.NET概论及软件使用_黑客防线网安服务器维护基地--Powered by WWW.RONGSEN.COM.CN

A.NET 中大文件下载的跟踪和恢复(3)

作者:黑客防线网安ASP维护基地 来源:黑客防线网安ASP维护基地 浏览次数:0

本篇关键词:恢复跟踪中大'
黑客防线网安网讯:    十个字节。  诚实地说,我从来都没有找到使用这种特性软件片断。但是我拒绝在代码声明中写入"它并不是完全的HTTP兼容的"。略去这个特性必定会触犯墨菲法则(Murphy's Law)。无论...

    十个字节

  诚实地说我从来都没有找到使用这种特性软件片断但是我拒绝在代码声明中写入"它并不是完全的HTTP兼容的"。略去这个特性必定会触犯墨菲法则(Murphy's Law)。无论如何多部分范围还是被用于电子邮件传输中,把头信息、普通文本和附件分开。


示例代码

  我们知道了客户端和服务器如何交换头信息以保证可恢复的下载,把这些知识与文件块流的思想结合起来,你就可以给自己的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
 ' 初步检查成功

 

    黑客防线网安服务器维护方案本篇连接:http://www.rongsen.com.cn/show-14403-1.html
网站维护教程更新时间:2012-03-30 05:48:31  【打印此页】  【关闭
我要申请本站N点 | 黑客防线官网 |  
专业服务器维护及网站维护手工安全搭建环境,网站安全加固服务。黑客防线网安服务器维护基地招商进行中!QQ:29769479

footer  footer  footer  footer