经典ASP:在应用程序上下文中缓存XML文档

时间:2011-11-28 18:51:32

标签: caching asp-classic vbscript

因此我们有一个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扩展)中的示例也欢迎。

1 个答案:

答案 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