经典ASP:在应用上下文中缓存XML文档
所以我们有一个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扩展)也受到欢迎。
尝试使用所设定...
SET Application(cacheKey) = xmlDoc
你也应该使用下列内容来查看是否有对象存在。
If Application(cacheKey) is nothing Then
另外,您可以使用 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>
注意:在您的Global.asa加载文档对象: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
OK ...编辑螺纹事情apparment ...
使用这个家伙缓存您的对象... http://www.miniat.net/caprock-dictionary-object-component.asp
'设置'分配一个对象,正确,谢谢。让我碰到下一个错误,这次是一个真正的错误:'ASP 0197:80004005 - 无法将具有房间模型行为的对象添加到应用程序中。简而言之,我认为这是因为我试图在多个线程(在Application中)共享一个不准备以这种方式处理的对象。所以ASP不能立即避免并发问题。很好。必须检查VBScript语法。然后,有两件事要做:(1)共享文本(足够好);(2)共享一个自由线程的XML文档实例(有趣)。 – Lumi
urg ...我忘了那个... –
WOW你正在带我回到2000年......我无法相信我记得那个旧字典对象...... ;-) –
失败在哪里?内容不会被缓存?我认为你应该序列化和反序列化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