我们已经在几处见到ASP如何创建或修改在响应页面请示时被发送到客户的HTTP报头在Response对象中有几个属性和方法可帮助我们做到一点下面是一些报头方法
· 控制缓存和有效期
· 创建状态和定制的HTTP报头
· 指定MIME类型或内容类型
· 添加PICS标签
接下来将简要地研究每一个方面可在“Response Object”主页(show_responseasp)上单击相关属性名或方法名来检查我们所说的属性和方法
缓存和“到期”ASP网页
用户的浏览器以及他们和服务器这间的任一代理服务器都可以缓存HTML和用ASP创建的网页当用户随后请求页面时浏览器就发送一个“最新修改”的请求到服务器(使用一个包含缓存版本的日期的HTTP_IF_MODIFIED_SINCE报头)询问网页是否已被修改
若没有被修改服务器应用状态码和消息“ Not Modified”来响应浏览器将使用缓存的内容而不会通过网络下载一个副本若已经存在已修改的版本它就会与“ OK”状态码和消息一道被发送出去
) ResponseCacheContol属性
其他的一些因素也会影响这一处理过程然而任一被网页使用的网络路由内的代理服务器(一般位于客户机端)能被通过设置ResponseCacheControl属性为Private来放弃缓存网页在ASP 中对ASP网页这是缺省的不用设置但在网页为个别访问者特别定制时尤其有用这可以阻止别的在同一网络上的用户进入同一网页当CacheControl的属性值被设定为Public时允许服务器缓存网页注意一些代理服务器可能表现得不尽相同或忽视或越过这个报头
在IE中在代理服务器缓存可用时有可能得到一个虚假的“This page has expired”消息我们已提供了一个网页(expiretest_formasp)可以通过自己的代理服务器在网络上做试验来检查这一属性的影响可以通过在“Response Object”主页中单击“Response CacheControl”链接来显示这个网页如下图所示
这一页面提交到expiretest_resultasp网页时能够设置ResponseCacheControl属性然后在网页中插入值和脚本被执行的时间
<%
If RequestForm(“public”) = “on” Then ‘CacheControl check box was ticked
ResponseCacheControl = “Public”
Else
ResponseCacheControl = “Private”
End If
%>
<HTML>
CacheControl is: <B><% = ResponseCacheControl %></B><P>
Value in text box is: <B><% ResponseWrite RequestForm(“textbox”) %>
<%
ResponseWrite Right(“” & Hour(Now)) & “:” & Right(“” & Minute(Now)_
& ) & “:” & Right(“” & Second(Now))
%></B>
通过单击浏览器上的“Back”和“Forward”能看到代码是自动执行还是使用缓存的副本
) ResponseExpires和ResponseExpiresAbsolute属性
控制缓存的网页存放时间的两个属性为Response对象的Expires和ExpriesAbsolute属性ResponseExpires定义了风页在从缓存区被丢弃前应保持有效的时间长度以创建以来的分钟数形式表示ExpiresAbsolute属性为到期时间设置了一个绝对的日期和时间
我们提供一个命名为addheaders_formasp的例子网页用于演示如何使用这些属性在“Response Object”主页中单击对这两种属性的链接
在得到的页面中可加入自己定制的HTTP报头并可设置一些影响响应的HTTP报头的多种属性在“提交查询内容”按钮上单击时页面show_headersasp在返回的数据流中添加所选的报头然后显示用来完成此操作的代码显示相应的执行时间可用来检查页面是被缓存还是被再次执行
show_headersasp网页中的代码创建和添加HTTP报头程序如下
<%
‘Write HTTP headers before any other output
If RequestForm(“expires”) = “on” Then _
ResponseExpires = RequestForm(“expires_value”)
If RequestForm(“expiresabs”) = “on” Then _
ResponseExpiresAbsolute = RequestForm(“expiresabs_value”)
If RequestForm(“lastmod”) = “on” Then _
ResponseAddHeader “LASTMODIFIED” Cstr(RequestForm(“lastmod_value”))
If RequestForm(“pragma”) = “on” Then _
ResponseAddHeader “PRAGMA” CStr(RequestForm(“pragma_value”))
If RequestForm(“refresh”) = “on” Then _
ResponseAddHeader “REFRESH” CStr(RequestForm(“refresh_value”))
If RequestForm(“addheader”) = “on” And Len(RequestForm(“addheader_name”)) Then _
ResponseAddHeader CStr(RequestForm(“addheader_name”)) _
CStr(RequestForm(“addheader_value”))
If RequestForm(“status”) = “on” Then _
ResponseStatus = RequestForm(“status_value”)
%>
<HTML>
Show code and execution time
其余部分仅仅是显示已被执行的代码和执行时间读者会注意到包含在网页中的定制的报头“PRAGMA”(至今我们还没讨论过)一些(先前的)代理服务器使用它作为网磁是否应被缓存的指示缺省是网页被缓沖除非接受到HTTP报头“PRAGMA=NOCACHE“
创建状态码和定制的HTTP报头
可使用先前在实例网页中所看到的Response对象的AddHeader方法来创建自己的状态码或自己喜欢的定制的报头这一方法需要两个参数HTTP报头名称或一个包含其值或分配给它的值的字符串作为一个例子下面的代码在页面中添加REFRESH报头
ResponseAddHeader “REFRESH” ”;URL=newpath/newpageasp”
这等同于客户机端<META>元素
<META HTTPEQUIV=”REFRESH” “;URL=newpath/newpageasp”>
换句话说也可配合Status属性使用AddHeader方法使浏览器载入一个新的页面
ResponseStatus = “ Object Moved”
ResponseAddheader “Location” “newpath/newpageasp”
这等同于使用ResponseRedirect方法
ResponseRedirect “newpath/newpageasp”
ResponseStatus属性可被用来发送一些所需要的状态消息例如添加如下几行
ResponseStatus= “ Unauthorized”
ResponseAddheader “WWWAuthenticate” “BASIC”
强制浏览器显示一个用户名/口令对话框然后使用BASIC验证把它们发送回服务器(将在本系列后续部分看到验证方法)
MIME类型和内容类型
当我们想向浏览器发送一个动态创建的字符串而且它们自己提供给浏览器时没有直接指明内容类型而是提供表示是否是磁盘文件的扩展名时ResponseContentType是非常有用的除非特别指定所有ASP创建的网页缺省都为“text/type”内容类型的标识符是MIME类型(MIME代表Multipurpose Internet Multimedia Extension或Multipupose Internet Mail Extension通常依据上下文来定)
例如若发送到客户的数据注解是通过从数据库读二进制值创建的图片就需要在发送任何内容之前添加合适的CONTENTTYPE报头
ResponseContentType = “image/jpeg”
假如从一个数据库创建一个XML文件使用MIEM类型“text/xml”并且如果正在创建一个文本文件可以在文件编辑器中显示或作为一个磁盘文件在客户上被存储起来使用“text/text”
添加PICS卷标
RespnsePics属性仅仅是添加一个PICS(Platform for Internet Content system)卷标到页面上方式与通常用<META>标记所用的方式相同
QUOT = Chr()
StrPicsLabel = “(PICS” & QUOT & “”_
& QUOT & “ gen true comment “ & QUOT _
& “RSACi North America Server” & QUOT & “ for “ & QUOT _
& “
& “T:” & QUOT & “ r (n s v l ))”
ResponsePics(strPicsLabel)
这段代码添加了如下的PICS卷标
(PICS “” gen true comment “RSACi
North America Server” for “:”
r (n s v l ))
要得到关于PICS的更多的信息或了解更多的定义页面内容的方式请检索站点
在Internet Service Manager中定义报头
在本系列文章的第一部分已经说明了如何在Internet Service Manage(MMC插件)应用程序中设置每个Web网站和IIS 目录的属性这就定义了使用此站点或目录资源发送到客户机的所有请求的HTTP报头也就提供了使用每个网页中的ASP脚本代码设置这些属性的替代方法
在Web站点或目录上右击鼠标并选择“Properties”在其对话框的“HTTP Headers”选项卡中可设置页面内容有效期的相对时间或绝对日期定义定制的报头创建PICS内容等级标签也可以通过MIME类型映射来定义内容类型
那么可以看到已创建了自定义的REFRESH HTTP报头应用于从此目录载入的所有网页即每一分钟自动地重载(刷新)一次(对于显示棒球比赛的最近比分是非常理想的但对服务器而言负担太重了)
要在“MIME Map”框中添加自定义的内容类型映射只需在“Properties”主对话框中单击“File Types”按扭把它们添加到清单中即可
当使用HTTP报头开始试验时你很快会发现不是所有的浏览器表现都相同许多浏览器以不同的方式响应不同的HTTP报头使得可靠地建立一个普遍适用的原则有时极为困难
使用客户证书
假如设立了一个安全的Web网站或部分内容具有安全机制的网站可安装一个数字服务器证书通过允许访问者使用证书中的加密的细节来验证服务器每一次对该站点或目录的页面请求服务器都将发送证书的一个副本浏览器可检查这个副本以确定正在和谁交谈
同样也可设置服务器要求用户在进入网站时提供一个有效的数字证书他们可从很多来源获得此证书例如Verisign()或Thawte Consulting读者将在第章看到这一处理过程的细节
这些情况都使用了Request对象的ClientCertificate集合的值本章的实例代码中已包含了一个显示用户如何使用些集合值的一些方法的页面
这一网页被命名为showcertasp而且其所做的一切就是遍历ClientCertificate集合显示其包含的所有值可使用以前经常使用的简单代码来完成它唯一的不同之处就是建立一个HTML表以容纳结果并将其截为每个字符一组
<TABEL CELLPADDING= CELLSPACING=>
<%
For Each keyItem In RequestClientCertificate()
StrItemValue = RequestClientCertificate(keyItem)
If Len(strItemValue) > Then strItemValue = Left(strItemValue ) & “etc”
ResponseWrite “<TR><TD>” & keyItem & “ = “ & strItemValue & “</TD></TR>”
Next
%>
</TABLE>
使用客户证书重定向
一旦要求所有访问网站或部分网站的浏览者给出的其客户证书就可以使用其包含的信息来制作我们为此用户创建的网页例如可使用他们的证书的Organization条目来自动使他们重定向到该网站的指定部分使别的访问者重定向到别的地方
If RequestClientCertificate(“SubjectO”) = “Wrox Press Inc” Then
ResponseRedirect “/wrox_staff/defaultasp” ‘Wrox staff site
Else
ResponseRedirect “/public/Defaultasp” ‘Normal public site
End If
相应地可使用Country条目来使访问者重定向到一个相应的网站
Select Case RequestClientCertificate(“SubjectC”)
Case “UK”: ResponseRedirect “
Case “DE”: ResponseRedirect “
Case “FR”: ResponseRedirect “
‘ ect
Case Else: ResponseRedirect “
End Select
读写二进制数据
有两个方法提供了对从浏览器发送到服务器的HTTP数据流和从服务器返回到浏览器的数据流的二进制数据访问RequestBinaryRead方法可得到指定要读取的字节数的参数并返回变体类型的数组其中包含从请求的POST段中得到的字节(例如在ASP的Form集合中数据)下面的程序读数据的头个字节
varContent = RequestBinaryRead()
假如使用了BinaryRead方法以后就不能访问ASP的RequestForm集合同样一旦我们采用任何方式引用了RequestForm集合就不能使用BinaryRead方法
把二进制数据写进ASP创建的响应流中也是可能的可采用BinaryWrite方法需要给其提供想写到客户的字节的变体类型数组
ResponseBinaryWrite(varContent)
这些方法都很少使用除非从一个数据库创建非HTML源才用到这些方法使用的一个实例就是从数据库读取组成图像的字节并使用BinaryWrite方法把它发送到客户
创建定制的日志消息
假如设置了服务器以WC Extended Log File Format格式将请求记录到一个文本文件可使用ResponseAppendToLog方法在日志文件条目的结尾处添加一条消息字符串若想为特定的网页存储一些值或消息或在脚本中出现了特定的情况时这种方式是非常有用的
例如通过的Intranet的“stationary order”应用程序可以记录超过特定的条目数目的雇员的部门号码
If intItemCount > Then
ResponseAppendToLog “Large order from ‘” & strDept & department”
End If
设置扩展的日志
要使用AppendToLog方法必须激活WC Extended Log File Format日志设置该设置方法是进入Properties对话框中的Web Site选项卡选中Enable Logging复选框选择WC Extended Log File Format并单击Properties按钮如下图所示
在出现的Extended Logging Properties对话框中可选择想包括进日志文件的条目确保选中URI Stem否则AppendToLog方法将失败
我们提供了一个试图在日志文件中写入一个条目的简单实例页面可从Request Object主页(show_requestasp)中的AppendToLog方法链接处打开它这一页面所做的全部工作就是创建一个包含当前日期和时间的简单字符串然后执行AppendToLog方法
strToAppend = “Page executed on ” & Now
ResponseAppendToLog strToAppend
小结
本文已经开始了对ASP 的研究而且我们也看到了ASP 如何与Internet Informateion Server 共同工作以提供一个易用的高效的创建动态Web网页和Web应用程序的方法当然仍有一些地方需要去研究本章仅仅是学习了ASP内置的两个最基本的对象
这两个最基本的对象是Request和Response对象允许我们访问和使用作为客户机/服务器会话一部分的值无论用户何时从Web网站请求和载入一个网页或资源这种会话就会进行意味着Request对象能够提供对用户请求的全部内容的访问同时Response对象允许创建和修改服务器发回的响应
这些对象能够通过集合和属性揭示会话的各个部分并提供了多个能用来检索和修改各段的方法假如把它们当作分解用户请求和使用相应的内容创建响应的工具这有助你理解究竟发生了什么这也将有助于理解各种方法如何影响客户服务器和正在创建的网页