iis
6.2.6 Content Rotator组件
Content Rotator组件像一个简化的Ad Rotator组件,需要提供一种内容调度文件(Content Schedule File)。该文件仅是一种包含文本段和HTML代码段的文本文件,Content Rotator组件可在页面中自动显示其中的一个。调度表文件可以包括任何数量的文本内容条目,并可规定比率,用以控制在返回网页中每个条目的显示频率。
1. 内容调度文件
内容进度文件的结构比Ad Rotator的调度文件简单,仅需提供要使用的各个文本字符串的列表,由前面加两个百分号(%%)的语句行说明。为了设置每个条目的比率(决定它出现在返回页面中的频率),在双百分号的后面添加了一个数字,其后还可跟一对前向斜线符(//)添加注释。如:
%% 3 // This is the first entry in the schedule text file
For more information, mail us at
<A HREF=mailto:feedbackwrox.com>Wrox Press</A>
%% 4 //This is a multi-line text string
<H4>Wrox Press</H4>
<UL>
<LI> Language Primers
<LI> Advanced Programming
<LI> Internet Applications
</UL>
%% 2
Visit us on the <A HREF="http://www.wrox.com">World Wide Web</A>
这个例子说明了可以用于网页中的三个文本字符串,比率分别是3、4和2,所以条目将以3/9、4/9和2/9的频率出现。注意(和Ad Rotator组件一样)每个字符串的实际出现是随机的,然后经修正后获得相应的比率,如果调入网页九次,可能不会正好得到这个结果。
2. Content Rotator组件的成员
Content Rotator组件仅提供两个方法,用于从内容调度文件中检索内容,如表6-5所示:
表6-5 Content Rotator组件的方法及说明
方 法
说 明
GetAllContent(schdule_file)
检索和显示schdule_file文件中的所有字符串
ChooseContent(schdule_file)
检索(但不显示)来自schdule_file文件的下一个合适的内容字符串
3. 使用Content Rotator组件
为了从调度文件中获得指定段的文本和HTML,可使用对象的ChooseContent方法检索一个条目,按照内容调度文件中规定的比率。可以使用Response.Write方法将其插入到发送给客房机的输出流中。
<% 'In VBScript:
Set objMyContent = Server.CreateObject("MSWC.ContentRotator")
strContent = objMyContent.ChooseContent("ContentRotator/content_schedule.txt")
Response.Write strContent
%>
这个代码使用了和页面在同一目录中的调度文件,如果这段代码存放在其他地方,必须注明调度文件的路径,这个路径可以是一相对于Web网站根目录的物理路径或是一个完整的虚拟路径。
ObjMyContent.ChooseContent("contentmycontent.txt") 'relative physical path
ObjMyContent.ChooseContent("/demo/mycontent.txt") 'full virtual path
如果想显示内容调度文件中的所有内容字符串,可以使用对象的GetAllContent方法,如ChooseaContent方法的情况一样,必须提供调度文件的路径。例如下面的代码得到了内容调度文件中的所有内容并显示在网页里。注意这个方法把内容自动地插入到网页中,所以不必使用Response.Write方法,这个方法也自动地在每个条目之间加了一个水平线。
ObjMyContent.GetAllContent("mycontent.txt")
为了研究Content Rotator组件的作用,从“ASP Installable Components”主菜单打开提供的示例页面,这个页面使用前面讲过的内容调度文件。调用ChooseContent方法,并把一个条目放在页面的顶部,然后使用GetAllContent方法显示调度文件中所有条目的内容。Content Rotator组件示例页面如图6-9所示:
6.2.7 Page Counter组件
Page Counter组件用于统计每个网页被访问的次数,该组件定期把统计的数据存入服务器磁盘上的一个文本文件——访问次数统计数据文件(Hit Count Data File)中,所以在停机或出现错误信息,当前数据也不会丢失。
1. Page Counter组件的成员
Page Counter组件提供了向该文件增加访问次数的方法以及读取和重新设置访问计数总和的方法,如表6-6所示:
方 法
说 明
Hits([Page_Path])
返回由Page_Path指定的网页的访问次数,如果选项Page_Path省略的话,返回的是当前网页的访问次数
PageHit()
增加当前网页的访问次数
Reset([Page_Path])
设置由Page_Path指定的网页的访问次数为0,如果选项Page_Path省略的话,设置当前网页的访问次数为0
2. 使用Page Counter组件
下面例子使用JScript语言来说明Page Counter组件的使用,先用Server.CreateObject方法创建对象实例,然后调用Hits方法得到对当前网页的访问次数。如果访问次数达到5次,则把计数器重新设置为0,并且在网页中放置一个链接,以便向访问者通过成绩。
<% // in JScript:
var objPageCount = Server.CreateObject('MSWC.PageCounter');
//look for a command sent from the FORM section buttons
// increment the counter and display the current hit count
objPageCount.PageHit();
Response.Write('You are visitor number ' + objPageCount.Hits() + '<P>');
// we treat every fifth visitor as a winner
if (objPageCount.Hits() == 5) {
objPageCount.Reset(); // reset the counter
Response.Write('You're a lucky winner!
');
Response.Write('<A HREF="winner.asp">Go to our winners page</A>
');
}
%>
注意在第二个Response.Write语句中,后向斜线()的使用是防止JScript引擎把引号看作字符串的结束。
本书提供了一个使用Page Counter组件的示例网页。然而,由于在每个示例页面里使用一个VBScript为这个组件示例编写程序。尽管在一个ASP网页里,混用脚本语言是可能的,但在SSI的#include文件中使用脚本语言能使网页缓存出现问题,并会引起不可预测的结果。虽然脚本语言不同,但示例网页的工作方式上与上述相同。Page Counter组件示例页面如图6-10所示:
该网页包含的<FORM>段中含有两个按钮,两个按钮都把窗体提交以重新调入网页。
<FORM ACTION="<% = Request.ServerVariables("SCRIPT_NAME") %>" METHOD="POST">
<INPUT TYPE="SUBMIT" VALUE=" "> Reload this page<P>
<INPUT TYPE="SUBMIT" NAME="cmdReset" VALUE=" ">
PageCounter.Reset( )
</FORM>
在网页的开头,与其他的示例网页一样,在请求中查找相关的按钮名字。在本页面中,我们仅对第二个名为cmdReset的按钮感兴趣,如果点击了该按钮,运行Page Counter组件的Reset方法,重新设置本页面的访问次数为0。
'look for a command sent from the FORM section buttons
If Len(Request.Form("cmdReset")) Then objPageCount.Reset 'reset the counter
前面看到的代码将调用PageHit方法把计数器设置为1,并显示在网页里。注意已经使用了Hits和Reset方法而没有给可选参数提供数值,所以它们都在当前网页计数器上操作,当然能够在另一个网页中使用,并可以对一些网页的统计结果汇总。
6.2.8 Permission Checker组件
Permission Checker组件用来检测用户当前正在访问网站的帐号是否允许读取某个特定文件或者访问某个资源(仅在Windows NT/2000而不是在Windows 9X)。可以用它来定制页面,这些网页中仅包含当前用户允许访问的资源的链接,这项技术对于隐藏限制访问的网页和资源是非常有用的,它可以使被限制的访问者不知道这些资源的存在,不会产生强行进入其中的企图。
1. Permission Checker组件的成员
Permission Checker组件只有一个方法,如表6-7所示:
表6-7 Permission Checker组件的方法及说明
方 法
说 明
HasAccess(file_path)
检查当前执行页面的用户帐号是否允许访问file_path指定的页面。该路径是一个网页、文件或资源的物理的或虚拟的路径。如果当前帐号允许访问,返回值为“True”,否则返回值为“False”
2. Permission Checker组件的工作过程
通常,除非特别规定,否则用户是匿名访问网页的,因此IIS本身会使用自己的Windows帐号访问网页,缺省值是IUSR_machinename(例如IUSR_WROXBOX),Permission Checker组件检查IUSR_machinename帐号是否能够访问指定的网页或资源。
然而,通过Internet Services Manager的Allow Anonymous Access选项关闭对Web网站或者对某一指定目录的匿名访问,可以强迫IIS提示用户输入一个有效用户帐号的用户名和口令,然后使用该帐号“非匿名访问”资源。
对一个网站或目录,在Internet Services Manager上的Properties对话框中的Directory Security选项卡中设定访问控制。在对话窗体中的Anonymous Access和Authentication Control中,点击Edit按钮打开Authentication Methods对话框,关闭Anonymous Access选项。设置界面如图6-11所示:
当Permission Checker组件在用户用其自己的帐号(而不是IUSR_machinename)访问的网页中被实例化时,将检查其帐号是否可以访问这个指定的资源,如果不能使用匿名访问,那么所有的用户必须提供帐号细节。可以使用Windows Explorer对每个文件或资源设置指定的权限(在相应的Properties对话框中的Security选项卡中)。设置界面如图6-12所示:
3. 使用Permission Checker组件
可以使用Permission Checker组件检查当前用户是否使用HasAccess方法访问其他页面(网站上的任何页面)的权限。本书提供了一系列实例页面,可用来试验Permission Checker组件,打开此示例(从ASP Installable Components主菜单里打开),会看到网页里的三项链接,如图6-13所示:
链接所指向的每一个页面都位于Chapter06示例目录下的PermissionChecker子目录中。Permission Checker组件检查当前用户是否有访问各个网页的权限。如果用户确实有访问这个网页的权限的话,这个网页的条目将是一个超级链接。
'create an instance of the component
Set objPermit = Server.CreateObject("MSWC.PermissionChecker")
%>
<UL>
<LI>
<% If objPermit.HasAccess("PermissionChecker/restricted_1.asp") Then %>
<A HREF="PermissionChecker/restricted_1.asp">
<% End If %>
Restricted Page Number 1
<% If objPermit.HasAccess("PermissionChecker/restricted_1.asp") Then %>
</A>
<% End If %>
</LI>
…
.. 'other page links here
…
</UL>
现在我们有访问三个有访问限制的网页的权限,所以这三个条目都是超级链接。然而这里不存在第四个链接(它可以被移去或是删除),因为组件不能使用当前用户(也就是IUSR_machinename)的帐号来访问它,因此不显示为超级链接。
注意这里选择仅移去超级链接但留下了链接文本,在实际情况中应删除不可访问的网页的整个条目。
如果从PermssionChecker子目录中的restricted_2.asp文件上删除Read(和任何其他的)权限,并重新调入网页,对应的条目将不显示为一个超级链接,如图6-14所示:
6.2.9 MyInfo组件
MyInfo组件最初是与个人Web服务器一起引入的,用于存储服务器管理员提供的个人信息。它现在可以用在ASP 3.0中,为名称/数值对,或者任何其他类型的可以表示为文本字符串的信息提供永久存储。该信息以XML格式在文本文件myinfo.xml中保存,此文件仅位于Web服务器的inetsrv目录下。在Windows 2000中,其路径为WinNTsystem32inetsrv。
和Counter组件一样,只需创建一个简单的MyInfo组件的实例就可以使用Web网站上的所有页面均能获得其信息,确保缺省Web站点上的global.asa文件中有下面的代码:
<!-- declare instance of the ASP MyInfo component with application-level scope
-->
<OBJECT ID="objMyInfo" RUNAT="Server" SCOPE="Application" PROGID="MSWC.MyInfo">
</OBJECT>
1. 使用MyInfo组件
MyInfo组件缺省时没有属性和方法。然而可给其添加属性,简单地说,也就是赋一个名称和数值给这些属性。比如,可以添加有关工作环境和合作伙伴的信息。
<% 'in VBScript:
objMyInfo.MyManager = "Christina Chan"
objMyInfo.MyPhoneExtension = "2851"
objMyInfo.MyCarParkingSpace = "4A-17"
objMyInfo.MyComputerName = "Priscilla"
%>
同别的组件属性一样,可以使用下面代码检索数值。
<% 'in VBScript:
strManagerName = objMyInfo.MyManager
strPhoneExtension = objMyInfo.MyPhoneExtension
strParkingSpace = objMyInfo.MyCarParkingSpace
strComputerName = objMyInfo.MyComputerName
%>
这是一种在两个页面请求之间存储值的有用方法,不需要用户的Session对象。这也为将来可能改变的数值提供了一个存储区域,采用这些值的页面将会在下次运行时自动地采集这些变化的值,从而避免必须编辑大量的其他页面。
本书提供了一个使用MyInfo组件的简单示例,这个示例从ASP Installable Components主菜单中运行,使用刚才讨论的设置组件属性的代码,并可改变属性值,如图6-15所示:
首次打开页面时,创建属性时使用了一个标志变量SetDefaultValues,该变量存放在用户的Session对象中。当页面在每个会话里首次打开时,把属性参数设置成“缺省”值,之后,把此标志变量设置成Yes。在当前会话中,重新调入页面时,这个数值将不再重新设置缺省值。
'an instance of the component is already created in global.asa
If Not Session("SetDefaultValues") = "Yes" Then
'set the properties if they're not set to the default values,
'i.e. if this is the first time that the page has been run
'during the current user session.
objMyInfo.MyManager = "Christina Chan"
objMyInfo.MyPhoneExtension = "2851"
objMyInfo.MyCarParkingSpace = "4A-17"
objMyInfo.MyComputerName = "Priscilla"
'set a session flag to show that the default values hve been set
Session("SetDefaultValues") = "Yes"
End If
每次调用页面时,检查请求中的值是否是用于改变属性值的按钮的名称。这个按钮在一个包含下拉列表和文本框的<FORM>上。如果发现点击了这个按钮,则从下拉列表和文本框里采集数值,然后用这些数值改变相关的属性值。
'look for a command sent from the FORM section buttons
If Len(Request.Form("cmdChange")) Then
strPropertyName = Request.Form("lstName") 'get the name of the property
strNewValue = Request.Form("txtValue") 'get the new value for the property
objMyInfo(strPropertyName) = strNewValue 'set the component property value
End If
6.2.10 Tools组件
Tools组件提供了一些有用的方法,可在页面中检查文件是否存在、处理一个HTML窗体、以及产生一个随机整数,还有用于Macintosh计算机的一些方法,还可以检查是否存在某个服务器插件以及检查用户是否是网站的拥有者。
1. Tools组件的成页
Tools组件提供了五个方法,其中两个依赖于操作系统,如表6-8所示:
表6-8 Tools组件的方法及说明
方 法
说 明
FileExists(relative_url)
如果relative_url指定的文件存在,返回值为True,否则为False。必须给出虚拟相对路径及文件名,并且文件必须存在于发布的Web网站目录中。
Random()
产生一个位于-32768~32767之间的随机整数。使用ABS函数(VBScript)或Math.abs(JScript)得到在0~32768之间的正整数。使用Mod运算符(VBScript)或%运算符(JScript)得到指定范围内的一个数值。例如:
intRand = (objTools.Random Mod 76) + 25
得到一个在25~100之间的整数。
ProcessForm(output_url,
template_url,[insertion_point])
通过template_url指定的文件处理一个HTML窗体,并且插入来自窗体中已提交给当前页面的数值。结果写进output_url指定的文件,如果指定了可选项insertion_point(字符串)参数的话,组件可在已存在的输出文件中找到这个字符串,并在该位置插入新的内容。如果insertion_point参数没有指定,任何已存在的output_url文件则被新的输出取代
Owner
仅适用于Macintosh机,如果当前用户帐户是Web网站的拥有者,返回值为True,否则返回值为False
PluginExists(plugin_name)
仅适用于Macintosh机,如果指定的服务器plugin_name安装在机器上,返回值为True,否则为False
2. 使用FileExists方法
在允许用户访问之前,可以使用FileExists方法检查某些文件是否存在于服务器中(注意这个方法和FileSystemObject.FileExists以同样的方式工作)。
下面的例子中,用户提供了网页的相对URL,如果用户想通过在名为txtURL的文本框中键入URL打开网页,在重新定向之前可以检查其是否存在。
<% // in Jscript:
var objTools = Server.CreateObject('MSWC.Tools');
var strURL = Request.Form('txtURL'); // collect the page URL they entered
if (objTools.FileExists(strURL)) // see if it exists
Server.Transfer(strURL) // if it does, transfer to it
Else // or if not display a message
Response.Write('Sorry, the page you requested does not exist');
%>
这里提供了一个示例页面(使用VBScript)来演示组件的三种方法(非Macintosh),可以从ASP Installable Components主菜单中运行,如图6-16所示:
网页的第一部分允许输入一个文件的相对URL,并告诉用户该文件是否存在。示例提供的缺省值是查看网站的根目录中是否有global.asa文件。点击按钮时,说明该文件是否可找到的信息将放在页面的顶部,如图6-17所示:
把页面的所有控件放在<FORM>中,提交回本页面,这已经成为一种规范。在页面的开始,查看点击了哪个按钮。如果是FileExists的按钮,就调用组件的FileExists方法并显示合适的信息。
'look for a command sent from the FORM section buttons
If Len(Request.Form("cmdExists")) Then
strFile = Request.Form("txtFile")
If objTools.FileExists(strFile) Then
Response.Write "The file '<B>" & strFile & "</B>' does exist.<P>"
Else
Response.Write "The file '" & strFile & "' <B>does not</B> exist.<P>"
End If
End If
3.使用Tools.Random方法
在ASP页面中,有时需要一个随机数来完成某些任务,例如,把用户重新定位到一个随机网页、选择颜色或显示每日提示。可以使用VBScript中的Rnd函数,但要把所得数值转变成指定范围内的整数。Tools组件的Random方法更易于使用,因为能够直接提供整数值。
Random方法的结果是一个在-32768~32767范围中的整数值,为了获得一个指定范围的整数,可以使用脚本语言中的Abs函数并对下一个最大的整数取模。例如为了用VBScript语言创建0~20的正整数,可以使用下列语句:
intRandom = Abs(objTools.Random) Mod 21
为了得到在50~100之间的数值,可以用:
intRandom = (Abs(objTools.Random) Mod 51) + 50
示例网页使用这项技术生成随机数时,首先需要检查由用户输入的数值,以保证这些数值既是有效正整数又有正确的相对关系。
If Len(Request.Form("cmdRandom")) Then
intMin = -1 'preset to illegal values and then
intMax = -1 'only set if a valid number is entered
strMin = Request.Form("txtMinimum")
strMax = Request.Form("txtMaximum")
If IsNumeric(strMin) Then intMin = CStr(strMin)
If IsNumeric(strMax) Then intMax = CStr(strMax)
If (intMin >= 0) And (intMax > intMin) Then
intRandom = (Abs(objTools.Random) Mod (intMax - intMin + 1)) + intMin
Response.Write "Your random value is: <B>" & intRandom & "</B><P>"
Else
Response.Write "<B>The numbers you entered are not valid.</B><P>"
End If
End If
当页面重新调入时,结果显示在网页的顶部,如图6-18所示:
4.使用Tools.ProcessForm方法
Tools组件中最复杂的方法是ProcessForm,用来读取存在磁盘上的临时文件,并在其中插入创建的信息(可能来自当前页面的Request.Form集合的内容),然后把结果作为一个文件输出到磁盘,这个方法的语法是:
ProcessForm (output_url, template_url, [insertion_point])
临时文件和输出文件相对于当前页面使用相对URL来定义。输出文件可以是ASP网页,如果这样,当其在浏览器打开时,将正常处理。临时文件可以包含普通的ASP代码,但不运行,仅简单地拷贝输出文件。然而,如果把临时文件中的ASP代码放在<%%…%%>限定符中,当临时文件调入时代码将被执行,这允许动态生成的数值(诸如进行处理的时间和日期)插入到输出页面中。
下面是示例文件template.asp(在chapter06目录的Tools子目录中):
This file was created by the ASP Tools component
------------------------------------------------
The content of the request was:
Output file name: <%% = Request.Form("txtOutput") %%>
Template file name: <%% = Request.Form("txtTemplate") %%>
Insertion point text: <%% = Request.Form("txtInsert") %%>
------------------------------------------------
Created <%% = Now() %%>
示例页面包含着预定使用这个临时文件的控件,这些控件创建一个和临时文件在同一个文件夹中的名为output.asp的输出文件,如图6-19所示:
点击按钮时,将运行一部分ASP代码,从文本框中采集数据并调用ProcessForm方法:
If Len(Request.Form("cmdProcess")) Then
strTemplate = Request.Form("txtTemplate")
strOutput = Request.Form("txtOutput")
strInsertPoint = Request.Form("txtInsert")
'…
' we display the template contents here
'…
' process the form contents
objTools.ProcessForm strOutput, strTemplate, strInsertPoint
'…
' we display the output file contents here
'…
End If
(1) 设置输出文件的访问权限
如果得到一个“MSWC.Tools error 80004005 Couldn’t open output file”错误信息,这意味着IIS不允许向指定的目录中写入输出文件。解决这个问题最快捷的方法是,在Properties对话框中的Security选项卡中,将相应的Tools目录以及存放output.asp的目录的Everyone组的Full Control设置成允许,如图6-20所示:
(2) 查看文件内容
图6-21显示了上面代码用缺省值运行缺省值运行的结果,可以看到原来的临时文件内容,以及使用ProcessForm方法插入到输出文件中的内容。
这里省略了显示来自前面见过的文件内容的程序代码。显示内容的方法与ASP Installable Components主菜单页面中用于显示内容链接列表文件的方法相同。使用FileSystemObject和TextStream对象的实例把整个文件读入到一个字符串中,然后将其插入网页中(记住要使用Server.HTMLEncode方法,以便把字符“<”和“>”转换成可用于显示的字符)。
QUOT = Chr(34) 'double-quote character
…
'create a FileSytemObject object to display the template file contents
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Response.Write "The content of the template file <B>" & _
strTemplate & "</B> is:"
Set objTStream = objFSO.OpenTextFile(Server.MapPath(strTemplate), ForReading)
strContent = Server.HTMLEncode(objTStream.ReadAll) 'read whole file
objTStream.Close
Response.Write "<DIV CLASS=" & QUOT & "showcode" & QUOT & "><PRE>" & _
strContent & "</PRE></DIV>"
…
(3) 关于插入点参数
ProcessForm方法可选的insertion_point参数能用来在文件中的特定点插入文本,这个方法是先查找输出文件中特定字符串的第一个实例,然后在该位置插入创建的新内容,在输出文件中通过把星号(*)放在insertion_point字符串前面来放置新内容。如果省略了insertion_point参数,新的内容会取代整个输出文件。
注意insertion_point参数在Tools.ProcessForm方法的早期版本中不能使用。
6.2.11 Logging Utility组件
Logging Utility组件是ASP 3.0的新组件,提供了访问日志文件的方法,这个日志文件是由服务器支持的用于Web和FTP网站的IIS创建的。
1. Logging Utility组件的成员
Logging Utility组件提供了六种方法,能读取日志文件的内容、把新记录写进已存在的日志文件中。这些方法和上一章讨论的FileSystemObject对象的方法有相似性,如表6-9所示:
表6-9 Logging Utility组件的方法及说明
方 法
说 明
AtEndOfLog()
用ReadLogRecord方法遍历记录时,如果文件中的所有记录都已读出,返回值为True
CloseLogFiles(io_mode)
关闭打开的日志文件,io_mode的值指定要关闭的文件,常数ForReading(1)表示关闭打开供读出的所有文件,ForWriting(2)表示关闭打开供写入的所有文件,AllOpenFiles(32)表示关闭打开的所有文件
OpenLogFile(filename,io_mode,
service_name,service_instance,
output_format)
打开filename指定的日志文件或日志文件集,可选的io_mode参数可以设置成ForReading(缺省值,1)或ForWriting(2)。当读取取一个特定的IIS服务(例如“W3SVC”和“1”)时,可选的service_name和service_instance参数限制从文件中返回的记录。可选的output_format参数指明写入文件时使用的格式
ReadFilter(start,end)
当在规定的时间和日期范围内读取文件时,限制返回的记录,两个参数都是可选的,如果忽略的话,start是文件的第一个记录,end是最后一个记录
ReadLogRecord()
从用OpenLogFile方法打开的当前日志文件中读取下一个记录
WriteLogRecord(logging_object)
从打开供读出的文件中把记录写入一个打开供写入的文件中,参数logging_object是一个引用保存源记录的Logging Utility组件实例的对象变量
Logging Utility组件提供了二十种与IIS日志记录相对应的属性,如表6-10所示:
表6-10 Logging Utility组件的属性及说明
属 性
说 明
BytesReceived
请求时从浏览器收到的字节数
BytesSent
响应时送至浏览器的字节数
ClientIP
客户机或其主机(即代理服务器)的IP地址
Cookie
在请求中传送的cookie内容
CustumFields
加到请求中的定制报头的一个数组
DataTime
请求的日期和时间(GMT)
Method
操作类型,如“Get”和“Post”
ProtocolStatus
返回到客户机的状态消息,即“200 OK”
ProtocolVersion
协议版本字符串,如“HTTP/1.1”
Referer
包含初始化请求链接的网页的URL
ServerIP
IIS机器的IP地址
ServerName
IIS服务器的机器名
ServerPort
请求到达的端口号,如“80”
ServiceName
服务器名称,如“MSFTPSVC”或“W3SVC”
TimeTaken
检索和创建网页的总处理时间
URIQuery
请求中加到URL的查询字符串中的所有参数
URIStem
请示的目标URL
UserAgent
由客户机发送的用户代理字符串
UserName
如果不是匿名地访问服务器,UserName是用户的登录名
Win32Status
处理了请求后返回的Win32状态码
2. 使用Logging Utility组件
Logging Utility组件最普遍的应用是用于对日志文件的自定义查询。从现有文件中选择一些记录写入新文件的能力,意味着能够汇总某些类型的条目,或者有选择性地挑出一些记录将来使用。
为了使用ForReading、ForWriting和AllOpenFiles常数,必须在网页的<HEAD>部分包含METADATA指令。
<!-- METADATA TYPE="typelib" FILE="C:WINNTsystem32inetsrvlogscrpt.dll" -->
为了遍历记录,仅须打开文件并且重复调用ReadLogRecord,直到AtEndOfLog的返回值为True。在下面的例子中将过滤记录,仅获得最后24小时以内的记录。
'Create the component instance
Set objLogUtil = Server.CreateObject("MSWC.IISLog")
'open the log file for reading, for the W3SVC instance number 1
objLogUtil.OpenLogFile "extend#.log", ForReading, "W3SVC", 1, 0
'set a filter for the last day's records only
objLogUtil.ReadFilter DateAdd("d", -1, Now), Now
'loop through the records
Do While Not objLogUtil.AtEndOfLog
objLogUtil.ReadLogRecord 'read the next record
Response.Write "Request received for page " & objLogUtil.URLStem & " on " _
& objLogUtil.DateTime & " from IP address " _
& objLogUtil.ClientIP & ".
"
Loop
objLogUtil.CloseLogFiles(ForReading) 'close the file(s)
本书提供了演示使用Logging Utility组件的一个示例网页,这个网页可以从ASP Installable Components主菜单运行。
确保在Internet Services Manager中不允许匿名访问包含示例文件的目录或loggingutility.asp文件,否则将不能访问日志文件。打开loggingutility.asp文件或包含该文件的目录的Properties对话框的Directory Security选项卡,点击Anonymous access and authentication control部分的Edit按钮,打开Authentication Method对话框,并关闭Anonymous access选项。
必须改变日志文件的文件名以适合你的计算机。在缺省Web网站的Properties对话框的Web Site选项卡中,打开W3C Extended Logging,如图6-22所示:
在这个对话框中,点击Properties按钮,打开Extended Logging Properties对话框,在这里会打开要用的文件名。选择固定大小的日志文件选项,这样文件名将是extend1.log和extend2.log等等。如图6-23所示:
打开Extended Properties选项卡,确保选中想要的条目,如图6-24所示:
现在可以运行示例网页并检查结果,可以使用下列代码在HTML表中显示数值。
<%
Set objLogUtil = Server.CreateObject("MSWC.IISLog")
objLogUtil.OpenLogFile "extend#.log", ForReading, "W3SVC", 1, 0
objLogUtil.ReadFilter DateAdd("d", -1, Now), Now
%>
<TABLE CELLPADDING="10">
<TR>
<TH>Date/Time</TH>
<TH>Client IP</TH>
<TH>Bytes Sent</TH>
<TH>Target URL</TH>
</TR>
<%
Do While Not objLogUtil.AtEndOfLog
objLogUtil.ReadLogRecord 'read the next record
%>
<TR>
<TD><% = objLogUtil.DateTime %></TD>
<TD><% = objLogUtil.ClientIP %></TD>
<TD><% = objLogUtil.BytesSent %></TD>
<TD><% = objLogUtil.URLStem %></TD>
</TR>
<%
Loop
objLogUtil.CloseLogFiles(ForReading)
%>
其结果如图6-25所示: