扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:陶刚编译 来源:天极网 2007年11月7日
关键字: Windows
' 使用objRequest检测请求了哪个文件,用该文件打开objFile。 ' 例如objFile = New Download.FileInformation(<完整文件名>) objFile = New Download.FileInformation( _ objContext.Server.MapPath("~/download.zip")) |
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 ' 初步检查成功 |
If bIsRangeRequest AndAlso CheckIfRange(objRequest, objFile) Then ' 这是范围请求 ' 如果Range数组包含多个实体,它还是一个多部分范围请求 bMultipart = CBool(alRequestedRangesBegin.GetUpperBound(0)>0) ' 进入每个范围来获取整个响应长度 For iLoop = alRequestedRangesBegin.GetLowerBound(0) To alRequestedRangesBegin.GetUpperBound(0) ' 内容的长度(这个范围的) iResponseContentLength += Convert.ToInt32(alRequestedRangesend( _ iLoop) - alRequestedRangesBegin(iLoop)) + 1 If bMultipart Then ' 如果是多部分范围请求,计算出将发送的中间头信息的长度 iResponseContentLength += MULTIPART_BOUNDARY.Length iResponseContentLength += objFile.ContentType.Length iResponseContentLength += alRequestedRangesBegin(iLoop).ToString.Length iResponseContentLength += alRequestedRangesend(iLoop).ToString.Length iResponseContentLength += objFile.Length.ToString.Length ' 49是多部分下载中换行和其它必要的字符的长度 iResponseContentLength += 49 End If Next iLoop If bMultipart Then ' 如果是多部分范围请求, ' 我们还必须计算出将发送的最后一个中间头信息的长度 iResponseContentLength +=MULTIPART_BOUNDARY.Length ' 8 是破折号和换行符的长度 iResponseContentLength += 8 Else ' 不是多部分下载,因此我们必须说明初始HTTP头信息的响应范围 objResponse.AppendHeader( HTTP_HEADER_CONTENT_RANGE, "bytes " & _ alRequestedRangesBegin(0).ToString & "-" & _ alRequestedRangesend(0).ToString & "/" & _ objFile.Length.ToString) 'End If ' 范围响应 objResponse.StatusCode = 206 ' 局部响应 Else ' 这不是范围请求,或者被请求的范围实体ID与当前的实体ID不匹配, ' 因此开始新的下载 ' 指明文件完成部分的大小等于内容的长度 iResponseContentLength =Convert.ToInt32(objFile.Length) ' 返回正常的OK状态 objResponse.StatusCode = 200 End If ' 接下来服务器必须发送几个重要的响应头信息,例如内容长度、Etag、和文件的内容类型: ' 把内容长度写入响应 objResponse.AppendHeader( HTTP_HEADER_CONTENT_LENGTH,iResponseContentLength.ToString) ' 把最后修改日期写入响应 objResponse.AppendHeader( HTTP_HEADER_LAST_MODIFIED,objFile.LastWriteTimeUTC.ToString("r")) ' 告诉客户端软件我们接受了范围请求 objResponse.AppendHeader( HTTP_HEADER_ACCEPT_RANGES,HTTP_HEADER_ACCEPT_RANGES_BYTES) ' 把文件的实体标签写入响应(用引号括起来) objResponse.AppendHeader(HTTP_HEADER_ENTITY_TAG, """" & objFile.EntityTag & """") ' 把内容类型写入响应 If bMultipart Then ' 多部分消息有这种特殊的类型 ' 在例子中文件实际的mime类型在以后才写入响应 objResponse.ContentType = MULTIPART_CONTENTTYPE Else ' 单个部分消息拥有的文件内容类型 objResponse.ContentType = objFile.ContentType End If |
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者