Jeg har lÊnge Þnsket mig at kunne lÊse indholdet af andres XML news feeds og websider i min server-side ASP-kode. Men den litteratur jeg ligger inde med om ASP og ASP.NET udvikling har ikke vÊret til megen hjÊlp. Forleden satte jeg mig sÄ ned og sÞgte lidt pÄ problemet, og for evt. andre interesserede er her sÄ lÞsningen jeg kom frem til. Det skal siges at jeg pÄ ingen mÄde er ekspert pÄ omrÄdet, og hvis der findes bedre metoder hÞrer jeg meget gerne om det.

ASP og VBScript

I "gammeldags" ASP skal man have fat i objektet ServerXMLHTTP. Hvis man f.eks. vil lÊse indholdet af mit RSS news feed, sÄ kan det gÞres med fÞlgende VBScript-kode:

Dim xml Dim ok ' Lav et xmlhttp objekt: Set xml = Server.CreateObject("MSXML2.ServerXMLHTTP") ' Åben forbindelsen: xml.Open "GET", "http://www.rockland.dk/xml/rss.asp", False ' Send request og lés data: xml.Send If xml.status = 200 Then ok = True If ucase(trim(mid(xml.responseText,1,6))) = "XMLERR" Then ok = False End If Else ok = False End If If ok = False Then ' Noget gik galt: Response.Write "xml.status: " & xml.status Response.Write "xml.statusText: " & xml.statusText Response.Write "ERROR: " & xml.responseText Else ' Udskriv det léste indhold: Response.Write "Lést kode: " & xml.responseText End If

Det lÊste indhold ligger nu som en streng i xml.responseText, og man kan bruge de sÊdvanlige streng-rutiner, regular expressions o.lign. til at fortolke indholdet. Indholdet af den lÊste side kan dog ogsÄ tilgÄs i xml.responseXML, og jeg formoder at man her har en "DOM-reprÊsentation" af siden som man kan "kravle rundt i" med sÊdvanlige DOM-rutiner. Jeg er ikke selv nÄet dertil at jeg har kigget pÄ dette endnu, sÄ om responseXML virker med HTML, eller om det kun er med rigtige XML-dokumenter (som f.eks. Atom og RSS news feed) har jeg ikke fundet ud af.

ASP.NET og C#

Her er sÄ kode der implementerer nogenlunde tilsvarende funktionalitet i ASP.NET. Eksemplet er i C#, og princippet er afprÞvet i ASP.NET 1.1 og 2.0. Koden implementerer en funktion GetContent() som tager en URL pÄ adressen der skal lÊses, samt en reference til en label (comstatus) hvori en evt. fejlmeddelelse skrives. Igen, jeg er ikke ekspert her, og mÄske kan det gÞres pÄ en bedre mÄde:

protected string GetContent(string url, System.Web.UI.WebControls.Label comstatus) { string result = ""; System.Net.HttpWebRequest wreq = (System.Net.HttpWebRequest)System.Net.HttpWebRequest.Create(url); wreq.Method = "GET"; wreq.Timeout = 3000; System.Net.HttpWebResponse wr = (System.Net.HttpWebResponse)wreq.GetResponse(); if (wr.StatusCode == System.Net.HttpStatusCode.OK) { System.IO.Stream s = wr.GetResponseStream(); System.Text.Encoding enc = System.Text.Encoding.GetEncoding("utf-8"); System.IO.StreamReader readStream = new System.IO.StreamReader(s, enc); result = readStream.ReadToEnd(); } else { comstatus.Text = "Error: " + wr.StatusCode + " / " + wr.StatusDescription; } wr.Close(); return result; }

I praksis...

Hvis du vil bruge ovenstÄende teknikker til at lÊse indhold fra andres sider eller news feeds for visning pÄ dine egne sider, sÄ skal man (udover evt. opretslovs-mÊssige overvejelser) vÊre opmÊrksom pÄ at det ikke er sÄ smart hvis andres sider lÊses hver gang dine sider vises. For det fÞrste er det ikke fair at duplikere alle requests mod dine sider til andres. Specielt ikke hvis dine sider er ofte besÞgt. Og desuden er det heller ikke sÊrligt venligt overfor dine brugere hvis de hver gang skal vente den ekstra tid det tager at lÊse de eksterne sider eller news feeds fÞrst. VÊr ogsÄ opmÊrksom pÄ at nogle feeds er konstrueret sÄ de maksimalt kan lÊses af den samme "bruger" f.eks. én gang i timen! I stedet bÞr man lÊse med et interval, og et ASP eksempel pÄ hvordan man kan sÊtte det op i global.asa kan findes pÄ ActiveDeveloper.dk. Det lÊste indhold kan man sÄ vÊlge at gemme i en database, i en almindelig tekstfil, eller mÄske i simple applikations-variabler indtil der lÊses igen nÊste gang (Hvis man vÊlger at gemme i applikations-variabler, sÄ skal indholdet selvfÞlgelig hentes igen hver gang applikationen genstartes).

Selv bruger jeg nu ovenstÄende til, via news feeds, at lÊse de seneste overskrifter fra et par venners weblogs, og linke til disse indlÊg her fra siden (pt. i "Venner der blogger" boksen i hÞjre spalte). Men der er flere ting pÄ tegnebrÊttet...

Update 15/2: Via et indlÊg pÄ 9am.dk er jeg blevet opmÊrksom pÄ et ASP-eksempel pÄ html.dk der lÊser et XML dokument (RSS news feed), og dét ser ganske interessant ud.

Comments

Write a comment... 

 

Hej, jeg har lÊnge efter det du har lavet, men jeg kan ikke fÄ dit eks. til at virke.
Den kommer med en fejl i linie 28:
Expected 'End'
/test/test.asp, line 28, column 29
hvor der i koden er denne linie:
Response.Write "LĂŠst kode:" xml.responseText

Har du selv fÄet samme fejl?

 

Hmm, ja. SÄdan gÄr det nÄr man piller i koden man poster uden at teste den igen. Der var rÞget et par tegn ud, og der var i Þvrigt ogsÄ en lille fejl i URL'en pÄ det news feed jeg prÞvede at lÊse. Begge dele skulle vÊre rettet nu, sÄ prÞv igen.

Write a comment... 

Only Name and Comment are required fields when commenting here. If you specify your email address, everyone will be able to find it at your comment. However your email will only be directly visible when hovering over your name, and in the code behind it will not look like an email address. So the risk of bots harvesting email addresses here, should be minimal. But again, you are free to leave the email blank when commenting.

If you tick Remember me, your name, email and homepage address will be remembered and prefilled at your next visit (Uses a cookie when ticked).

Full URLs (starting with "http://" or "https://") in comment text will be converted into active links when comment has been verified by a human as not being spam. Comments that looks too much like spam, will immidiately/proactively be rejected by the system and never reach a human eye.