2011-11-28 33 views
1

所以我们有一个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扩展)也受到欢迎。

+0

失败在哪里?内容不会被缓存?我认为你应该序列化和反序列化XML –

+1

@Eduardo,上述不起作用的原因是条件'如果不是应用程序(cacheKey)那么'会在Perl和其他语言中工作,但在VBScript中您需要更多精确:对于一个对象,你需要'IsObject()',对于一个你想要'IsEmpty()'的字符串。因此,我的印象缓存不起作用。该代码从未分支到“ELSE”。一旦得到解决,另一个错误出现。在下面看到我对jsobo的回复的评论。 – Lumi

+0

关于在这里困住我的布尔gotcha:[不逻辑是VBScript](http://blogs.msdn.com/b/ericlippert/archive/2004/07/15/184431.aspx) - “条件语句应始终采取换句话说,使用布尔人作为布尔人,除了布尔人之外别无其他。“ - 如果你知道'bla'是一个布尔值,那么只使用'If bla Then' *的形式;在所有其他情况下,在条件中使用显式比较来获得布尔值。 – Lumi

回答

1

尝试使用所设定...

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

+0

'设置'分配一个对象,正确,谢谢。让我碰到下一个错误,这次是一个真正的错误:'ASP 0197:80004005 - 无法将具有房间模型行为的对象添加到应用程序中。简而言之,我认为这是因为我试图在多个线程(在Application中)共享一个不准备以这种方式处理的对象。所以ASP不能立即避免并发问题。很好。必须检查VBScript语法。然后,有两件事要做:(1)​​共享文本(足够好);(2)共享一个自由线程的XML文档实例(有趣)。 – Lumi

+0

urg ...我忘了那个... –

+0

WOW你正在带我回到2000年......我无法相信我记得那个旧字典对象...... ;-) –