因此我们有一个ASP脚本来回答简单的AJAX搜索请求。要搜索的数据存储在XML文档中。一遍又一遍地解析这个文档将是浪费。解析它一次就足够快,读取内存中的数据(几千个字符串条目,而不是更多),然后从内存中回复。
所以这就像一个初始化任务。在启动(或首次运行)时,脚本必须加载数据;在后续请求中,使用它。
如何在ASP脚本中编写这样的初始化代码?我需要Global.asa
个文件吗?或者我可以在我的脚本中使用逻辑来检查Application.Contents
中是否存在要创建和存储的对象(如果不存在)?
这是我的代码,它试图缓存文档,但未能实现这一目标:
<%
Option Explicit
Sub PrintNodes( xmlDoc )
For Each node In xmlDoc.SelectNodes("//item")
key = node.GetAttribute("id")
value = node.ChildNodes(0).ChildNodes(0).Text
Response.Write( key & ": " & value & VbNewline )
Next
End Sub
Dim locale, cacheKey, xmlFile, xmlDoc, node, key, value
locale = "de_CH" ' Vorgabe
cacheKey = "doc." & locale
Response.ContentType = "text/plain"
Response.Write( cacheKey & VbNewline )
If Not Application( cacheKey ) Then
xmlFile = Server.MapPath( locale & "/kat.all.xml" )
Response.Write( xmlFile & VbNewline )
Set xmlDoc = Server.CreateObject("MSXML2.DomDocument.6.0")
xmlDoc.load( xmlFile )
If xmlDoc.parseError.errorcode <> 0 Then
Response.Write("XML Error" & VbNewline )
Else
PrintNodes( xmlDoc )
Application.Lock
Application( cacheKey ) = xmlDoc
Application.Unlock
End If
Else
Response.Write( "Jetzt ELSE!" & VbNewline )
Application.Lock
Set xmlDoc = Application( cacheKey )
PrintNodes( xmlDoc )
Application.Unlock
End If
%>
JScript或PerlScript(ActiveState PerlScript扩展)中的示例也欢迎。
答案 0 :(得分:1)
尝试使用set ...
SET Application( cacheKey ) = xmlDoc
你也应该使用以下内容来查看对象是否存在。
If Application( cacheKey ) is nothing Then
或者,您可以使用在global.asa中加载doc对象 http://msdn.microsoft.com/en-us/library/ms524620(v=vs.90).aspx
<OBJECT RUNAT=Server SCOPE=Application ID=XmlDoc PROGID="MSXML2.DomDocument.6.0"></OBJECT>
注意:SCOPE =申请很重要。
但是你必须以某种方式检查你是否已经加载了对象...你可以作弊并在你的初始化代码中加入这样的东西。
If Application("IAlreadyLoadedTheXmlDoc") <> "TRUE" THEN
' --- load the doc
Dim xmlfile
xmlFile = Server.MapPath( locale & "/kat.all.xml" )
xmlDoc.load( xmlFile )
Application("IAlreadyLoadedTheXmlDoc") = "TRUE"
End If
好的......为幻影的东西编辑...
使用这个人来缓存你的对象...... http://www.miniat.net/caprock-dictionary-object-component.asp