使用ASP常见问题解答

---（文/林子）

问题：如何保护自己的ASP源代码不泄露？
答：下载微软的Windows Script Encoder，对ASP的脚本和客户端JavaScript、VBScript脚本进行加密。客户端脚本加密后，只有IE5以上的版本才能执行，服务器端脚本加密后，只有服务器上安装有Script Engine 5（装IE5即可）才能解释执行。
问题：为什么Global.asa文件总是不起作用?
答：只有把Global.asa文件放在Web发布目录某个站点的根目录下它才有效，放在发布目录的某个子目录下不起作用。另外，也可以使用IIS4的Internet Service Manager把某个子目录设置为站点。
问题：为什么ASP文件总不解释执行?
答：在IIS服务器上没有给ASP文件以脚本解释的权限，所以ASP文件没有被Web服务器作为脚本代码进行解释执行，而被当成一般页面文件了。建议在Web发布目录中建立一个ASP目录，把所有ASP文件存放在此目录下，把ASP目录赋予脚本解释权限。
问题：ASP文件中使用Response.Redirect(url) 时导致错误“ The HTTP headers are already written to the client browser. Any HTTP header modifications must be made before writing page content”，请问如何解决？
答：此错误为HTTP 标题在写入页内容之后，写到了客户浏览器中。任何 HTTP 标题的修改必须在写入页内容之前进行，解决的方法为在ASP文件最开头加入Response.Buffer = True，在文件的结尾加入Response.Flush。
问题：为什么Session 有时候会消失？
答：Session很像临时的Cookie，只是其信息保存在服务器上（客户机上保存的是SessionID）。Session变量消失有几种可能，如：使用者的浏览器不接受Cookie，因为Session依赖于Cookie才能跟踪用户；Session在一段时间后过期了，缺省为20分钟，如果希望更改，可以通过设置Microsoft Management Console的Web Directory→Properties→Virtual Directory→Application Settings→Configuration→App Options→Session Timeout选项来改变Session的超时时间，也可以在ASP脚本中设定， 如Session.Timeout=60，可设定超时时间为60分钟。
问题：怎样才能知道访问者的一些信息？
答：通过Request.ServerVariables(″HTTP—USER—AGENT″)获得访问者浏览器的类型； Request.ServerVariables(″REMOTE—ADDR″)可获得访问者的IP地址；而访问者的语言环境可通过Request.ServerVariables(″HTTP—ACCEPT—LANGUAGE″)来获得。
问题：怎样才能将Query String从一个ASP文件传送到另一个ASP文件？
答：前一个ASP文件加入下列代码：Response.Redirect(″second.asp?″ ＆ Request.ServerVariables(″QUERY—STRING″))即可。
问题：ASP中如何控制Cookies？
答：若想写入Cookies可用：Response.Cookies(″待写入的Coookies名称″)=待写入数据。读取Cookies则使用：读取数据=Request.Cookies(″待读的Cookies名称″)。
注意，写入Cookies的Response.Cookies程序段必须放在〈html〉标记之前，且不可以有任何的其它html代码。另外，Cookies中必须使用Expires设定有效期，Cookies才能真正地写入客户端硬盘中，否则只是临时的。
问题：怎样实现用ASP发送邮件？
答：用户需装上Windows NT Option pack的SMTP Service功能。实现代码如下：〈％
Set mail = Server.CreateObject(″CDONTS.NewMail″)
mail.TO = ″abc@xxx.com″
mail.From = ″yourmail@xxx.com″
mail.Subject = ″主题″
mail.Body = ″E－Mail内容″
mail.Send
％〉
问题：ASP与数据库连接一定要在服务器端设置DSN吗？
答：不一定， ASP与服务器的数据库连接有两种方法，一种为通过DSN建立连接，另一种不用DSN建立连接。通过DSN连接数据库需要服务器的系统管理员在服务器的控制面板中的ODBC中设置一个DSN。如果没有在服务器上设置DSN，只要知道数据库文件名(比如Access、Paradox、FoxPro的数据库)或者数据源名(如SQLserver的数据库)就可以访问数据库，直接提供连接所需的参数即可。
连接代码如下：
set conn=server.createobject(″adodb.connection″)
connpath=″DBQ=″ ＆ server.mappath(″yourtable.mdb″)
conn.Open ″DRIVER={Microsoft Access Driver (.mdb)}; ″ ＆ connpath
set rs=conn.execute(″select  from authors″)
问题：如何从一页到另一页传递变量?
答：用Hidden表单类型来传递变量。
〈 form method=″post″ action=″mynextpage.asp″〉
〈％ for each item in request.form ％〉
〈input namee=″〈％=item％〉″ type=″Hidden″
value=″〈％=server.HTMLEncode(Request.form(item)) ％〉″〉
〈％ next ％〉
〈/form〉
用Session来保存变量。
〈％Session(″bh″)= request.form (″bh″)％〉
用QueryString保存变量。
〈a herf=″action.asp?bh=10″〉查询〈/a〉
〈％Request. QueryString (″bh″)％〉
问题：如何用ASP实现在线人数统计？
答：在线人数是指一个时段内的访客人数统计，时间的长短是由设计者设定的。
在这个时段内，各个不同IP访问本站点的总数，就是当前的线上人数。在ASP中，使用Session对象来实现统计，实现代码如下：
Golobal.asa文件
〈SCRIPT LANGUAGE=″VBScript″ RUNAT=″Server″〉
Sub Session—OnStart
application(″online″)=application(″online″)＋1
End Sub
Sub Session—OnEnd
application(″online″)=application(″online″)－1
End Sub
sub Application—OnStard
application(″online″)=0
End Sub
sub Application—OnEnd
application(″online″)=0
End Sub
〈/SCRIPT〉
Online.asp 文件内容
〈％ tmp=application(″online″)
tmp=Cstr(tmp)
dim disp(20)
dim images(20)
dbbits=len(tmp)
for i= 1 to dbbits
disp(i)=left(right(tmp,i),i－(i－1))
next
for i=dbbits to 1 step －1
images(i)=″〈img src=″＆″http://xxxx.com.cn/pic″＆″/″＆disp(i)＆″.gif〉″
response.write ″document.write(′　″＆images(i)＆″ ′);″
next ％〉
问题：ASP程序运行的时间如何计算？
答：确定ASP程序的执行时间的代码如下所示：
〈％
dim t1,t2
t1=now()
′被检测的ASP代码
t2=now()
response.write ″运行这段ASP代码用了″＆cstr(cdbl((t2－t1)＊24＊60＊60)) ＆ ″秒″
％〉