geRequest设置为True.如果请求了范围,CheckIfRange方法会验证IfRange头信息。
如果被请求的范围是有效的,代码会计算响应信息的大小。如果客户端请求了多个范围,响应信息大小的数值会包含多部分头部信息长度的数值。
如果不能确定某个发送的头部信息值,程序将把这个下载请求作为最初请求而不是部分下载来处理,从文件的顶部开始发送一个新的下载流。
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
'' 多部分消息有这种特殊的类型
'
|