所以我们有一个ASP脚本来回答简单的AJAX搜索请求。要搜索的数据存储在XML文档中。一遍又一遍地解析这个文档是浪费的。解析一次,读取内存中的数据(几千个字符串条目,而不是更多),然后从内存中回复是足够和快速的。经典ASP:在应用上下文中缓存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扩展)也受到欢迎。
失败在哪里?内容不会被缓存?我认为你应该序列化和反序列化XML –
@Eduardo,上述不起作用的原因是条件'如果不是应用程序(cacheKey)那么'会在Perl和其他语言中工作,但在VBScript中您需要更多精确:对于一个对象,你需要'IsObject()',对于一个你想要'IsEmpty()'的字符串。因此,我的印象缓存不起作用。该代码从未分支到“ELSE”。一旦得到解决,另一个错误出现。在下面看到我对jsobo的回复的评论。 – Lumi
关于在这里困住我的布尔gotcha:[不逻辑是VBScript](http://blogs.msdn.com/b/ericlippert/archive/2004/07/15/184431.aspx) - “条件语句应始终采取换句话说,使用布尔人作为布尔人,除了布尔人之外别无其他。“ - 如果你知道'bla'是一个布尔值,那么只使用'If bla Then' *的形式;在所有其他情况下,在条件中使用显式比较来获得布尔值。 – Lumi