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.