Avatar billede lund_dk Praktikant
15. februar 2011 - 22:08 Der er 8 kommentarer og
1 løsning

Cache XML fil

jeg har denne kode, som henter en XML fil
Men nu kræver det at jeg har en cachetimeout på 120, for at få lov at hente.

Hvordan hulan fixer jeg dette i mit script?

<%
strURL = "http://" & strLand & ".worldsbiggestchat.com/onlinestatxml.aspx"

set xmlDoc = createObject("Msxml.DOMDocument")
xmlDoc.async = false
xmlDoc.setProperty "ServerHTTPRequest", true
on error resume next
xmlDoc.load(strURL)
Response.Write Err.Number
strOnline = xmlDoc.documentElement.childNodes(1).text

arrOnline = Split(strOnline," ")

%>
Avatar billede softspot Forsker
16. februar 2011 - 00:52 #1
Det betyder vel bare at du skal gemme XML'en, f.eks. som en fil eller i en application-variabel, lokalt i mindst 120 sekunder inden du forespørger den igen fra den eksterne server.

Du kan f.eks. lægge den i application således:

dim ts, doUpdate

' tag udgangspunkt i at cachen ikke skal opdateres
doUpdate = false

' hent timestamp for sidste opdatering af cachen
ts = application("wbcxml_timestamp")

' undersøg om cachen skal opdateres
if iempty(ts) then
  ' ts er slet ikke sat endnu, så derfor skal data hentes 1. gang
  doUpdate = true
elseif not isdate(ts) then
  ' ts er ikke en dato
  doUpdate = true
elseif datediff("s", cdate(ts), now) > 120 then
  ' der er gået mere end 120 sekunder siden sidste opdatering
  doUpdate = true
end if

' foretag evt. opdatering, alternativt aflæsning, af cachen
if doUpdate then
  ' hent XML'en fra den eksterne kilde og opdater cachen...
  strURL = "http://" & strLand & ".worldsbiggestchat.com/onlinestatxml.aspx"

  set xmlDoc = createObject("MSXML2.FreeThreadedDOMDocument.6.0")
  xmlDoc.async = false
  xmlDoc.setProperty "ServerHTTPRequest", true
  on error resume next
  call xmlDoc.load(strURL) 
  set application("wbcxml") = xmlDoc
  application("wbcxml_timestamp") = now
else
  ' hent xml-struturen fra cachen
  set xmlDoc = application("wbcxml")
end if

' benyt det aktuelle xmlDoc
strOnline = xmlDoc.documentElement.childNodes(1).text
arrOnline = Split(strOnline," ")

NB: Der benyttes FreeThreadedDOMDocument, da application ikke accepterer singlethreaded eller apartement threaded objekter...

Det er meget muligt du bare kan nøjes med at gemme værdien i strOnline, men ikke desto mindre kan teknikken omkring caching stadig bruges.
Avatar billede lund_dk Praktikant
16. februar 2011 - 11:59 #2
Det ser godt ud. Men jeg får denne fejl, når den har gemt i cachen og vil hente fra cachen (application("wbcxml"))

Microsoft VBScript runtime error '800a01a8'

Object required: '[object]'

det er på denne linie

strOnline = xmlDoc.documentElement.childNodes(1).text
Avatar billede softspot Forsker
16. februar 2011 - 12:35 #3
Det kan skyldes flere ting. Det kan være fordi xmlDoc ikke er et objekt (dvs. det ikke er blevet oprettet under læsningen eller da det blev hentet fra cachen), eller at der ikke er nogle childnodes til documentElement på indeks 1.

Du kan teste det ved at indsætte disse 2 linjer efter cachelæsningen, men dog inden du forsøger at aflæse childNodes:

Response.Write "xmlDoc eksisterer: " & (not xmlDoc is nothing) & "<br>"
Response.Write "Antal childNodes: " &  xmlDoc.documentElement.childNodes.Count & "<br>"

Det er muligt at du skal benytte length i stedet for Count, den er jeg ikke helt sikker på.

Hvis den første af disse to linjer skriver false, så fejler den anden, men ellers burde du kunne se hvormange underelementer der er til documentElement og dermed om den indeksering du laver er mulig...
Avatar billede lund_dk Praktikant
16. februar 2011 - 12:58 #4
XMLDoc er true,

men den anden linie har samme fejl
Microsoft VBScript runtime error '800a01a8'

Object required: '[object]'

Jeg vil at childNodes(1) findes, for i det oprindelig script der virkede det uden problemer :)
Avatar billede softspot Forsker
16. februar 2011 - 13:12 #5
Hvilke oplysninger fra XML-strukturen skal du bruge? Jeg vil foreslå, at du specifikt henter det element du skal bruge vha. xpath. Du kunne for at hente users f.eks. skrive:

set xUsers = xmlDoc.selectSingleNode("/noesischat/users")
if not xUsers is nothing then
  Response.Write Server.HTMLEncode(xUsers.selectSingleNode("totalonline").nodeValue)
  Response.Write " online<br>"
else
  Response.Write "Antal brugere er ikke tilgængeligt i øjeblikket<br>"
end if
Avatar billede lund_dk Praktikant
18. februar 2011 - 21:34 #6
Nu har jeg testet frem og tilbage, men får hver gang:
Antal brugere er ikke tilgængeligt i øjeblikket

Prøv at se

http://lund.dk/tmp_test.asp
Avatar billede softspot Forsker
19. februar 2011 - 01:04 #7
Prøv at vise din kode. Det er svært at forholde sig til et resultat man ikke kan se hvordan er fremkommet... :-)
Avatar billede lund_dk Praktikant
26. april 2012 - 08:38 #8
et par dage siden, men er ved at rydde lidt op.. smit et svar for at få point for indsatsen
Avatar billede softspot Forsker
26. april 2012 - 09:04 #9
Kommer her! :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester