Классический ASP: кешировать XML-документ в контексте приложения - PullRequest
1 голос
/ 28 ноября 2011

Итак, у нас есть 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 Ответ

1 голос
/ 29 ноября 2011

попробуйте использовать set ...

 SET Application( cacheKey ) = xmlDoc

, также вы должны использовать следующее, чтобы увидеть, существует ли объект.

If Application( cacheKey ) is nothing Then

В качестве альтернативы вы можете загрузить объект doc в свой глобальный.asa, используя 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> 

ПРИМЕЧАНИЕ: ОБЛАСТЬ ПРИМЕНЕНИЯ = Приложение важно.

Но тогда вам придется каким-то образом проверить, загрузили ли вы уже объект ... который вымог бы обмануть и просто вставить что-то вроде этого в код инициализации.

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

...