Creare Feed RSS
Creare un feed RSS in ASP.NET
Cosa sia un feed RSS penso sia arcinoto anche ai piùsprovveduti dei nostri lettori, ma nel caso ci fosse qualchedubbio da dissipare, ecco una breve definizione: RSS èl'acronimo di Really Simple Syndication edè un popolare metodo di distribuzione dei contenutinel Web basato sul formalismo di XML. Solitamente le maggioripiattaforme di blogging (come Blogger eWordpress) creano dinamicamente il contenuto delfeed RSS in base ai post che vengono pubblicatidall'autore. I lettori in seguito, leggono i contenutidel blog attraverso i feed reader, programmi o servizi Webdeputati alla lettura e consultazione di feed RSS (come
Date le premesse, sembra che i feed RSS siano strettamentelegati ai blog (e ciò è vero), ma nulla vietadi crearsi un proprio feed RSS per siti Web che non siano deiblog (per esempio per postare delle notizie o aggiornamenti).In quest'articolo vedremo come creare un feed RSSattraverso la tecnologia ASP.NET.
Uno sguardo agli elementi principali di un feed RSS
Prima di tutto, si farà uso di un handler ASHX (unadescrizione di questa tecnica viene data in quest'articolo).
Come detto inprecedenza, un feed RSS non è altro che un documentoXML che segue certi standard. Vediamo come esempio parte di unfeed RSS:
<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0"> <channel> <title>ASPCode.net RRS flow</title> <link>http://www.aspcode.net/articles/default.aspx</link> <description>Articles about ASP.NET, C# and development with Visual Studio</description> <ttl>5</ttl> <item> <title>Creating an RSS feed for your ASP.NET site</title> <link>http://www.aspcode.net/articles/l_en-US/t_default/ASP.NET/Creating-an-RSS-feed-for-your-ASP.NET-site_article_277.aspx</link> <guid isPermaLink="true">http://www.aspcode.net/articles/l_en-US/t_default/ASP.NET/Creating-an-RSS-feed-for-your-ASP.NET-site_article_277.aspx</guid> <description>How useful a RSS feed actually is is hard for me to say something about, I personally have a hard time understanding the buzz about blogs (why should that be better than a regular website). While the content people present in blogs might be really good - ... </description> <pubDate>Wed, 30 Aug 2006 13:00:09 GMT</pubDate> </item>
Seguono delle descrizioni sommarie degli elementi presentinel codice:
- title : contiene il nome del canale. E' il modo con cui la gente si riferisce a te.
- link : l' url al sito web.
- description: frase o motto che descrive il canale.
- ttl: è il numero di minuti che indica per quanto tempo un canale debba essere memorizzato nella cache del feed reader prima di venir aggiornato dalla sorgente.
Per ogni item (articoli) abbiamo:
- title: l' header dell'articolo.
- link: il collegamento all'articolo.
- description: sinossi, piccola descrizione dell'articolo.
- guid: una stringa che identifica univocamente ogni articolo. Spesso si hanno pagine univoche per ciascun articolo (per esempio
showart.aspx?id=123
). - pubDate: data di pubblicazione dell'articolo, per esempio nel formato
Sat, 07 Sep 2002 00:00:01 GMT
.
Creazione del codice ASP
andremo ora a creare la pagina rss.ashx
la qualedovrà ritornare un documento XML che segua ilformalismo specificato nella sezione precedente. Ogni azioneha luogo negli handler ProcessRequest
:
public void ProcessRequest (HttpContext context) { string sTxt = BuildXmlString(); context.Response.ContentType = "text/xml"; context.Response.ContentEncoding = System.Text.Encoding.UTF8; context.Response.Write( sTxt ); }
La costruzione del documento XML avviene per mezzo dellafunzione BuildXmlString
, che provvede acostruire la struttura del documento (title, description,ttl, ecc):
private string BuildXmlString(){ string sTitle = "The title if your blog"; string sSiteUrl = "http://www.aspcode.net"; string sDescription = "The site is the coolest bla bla and this rss feed is the best!"; string sTTL = "60"; System.Text.StringBuilder oBuilder = new System.Text.StringBuilder(); oBuilder.Append("<?xml version="1.0" encoding="UTF-8"?>"); oBuilder.Append("<rss version="2.0"><channel>"); oBuilder.Append("<title>"); oBuilder.Append(sTitle); oBuilder.Append("</title>"); oBuilder.Append("<link>"); oBuilder.Append(sSiteUrl); oBuilder.Append("</link>"); oBuilder.Append("<description>"); oBuilder.Append(sDescription); oBuilder.Append("</description>"); oBuilder.Append("<ttl>"); oBuilder.Append(sTTL); oBuilder.Append("</ttl>"); AppendItems(oBuilder);oBuilder.Append("</channel></rss>"); return oBuilder.ToString();}
Adesso aggiungiamo gli articoli per mezzo della funzioneAppendItems
:
public void AppendItems(System.Text.StringBuilder oBuilder){ //read from database or whatever and retrieve the 10 latest articles //I have a class, ObjClasses.Article and a collection //ObjClasses.ArticleList which does the retrieving ObjClasses.ArticleList oList = new ObjClasses.ArticleList(); oList.OpenLatest(10); foreach( ObjClasses.Article oArt in oList ) { string sTitle = oArt.Header; string sLink = "http://www.aspcode.net/wharver/showarticle.aspx?id=" + oArtId.ToString() ; string sDescription = oArt.ShortDescr; string sPubDate = oArt.LastModified.ToString("R"); oBuilder.Append("<item>"); oBuilder.Append("<title>"); oBuilder.Append( sTitle); oBuilder.Append("</title>"); oBuilder.Append("<link>"); oBuilder.Append(sLink); oBuilder.Append("</link>"); oBuilder.Append("<guid isPermaLink="true">"); oBuilder.Append(sLink); oBuilder.Append("</guid>"); oBuilder.Append("<description>"); oBuilder.Append(sDescription); oBuilder.Append("</description>"); oBuilder.Append("<pubDate>"); oBuilder.Append(sPubDate); oBuilder.Append("</pubDate>"); oBuilder.Append("</item>"); }}
Questo è tutto quello che ci occorre. Per finire, cioccupiamo del caching:
public void ProcessRequest (HttpContext context) { string sTxt = "";if ( context.Cache["RSSFEED123"] == null ) {sTxt = BuildXmlString(context); context.Cache.Insert( "RSSFEED123" , sTxt ); } else sTxt = context.Cache["RSSFEED123"].ToString(); context.Response.ContentType = "text/xml"; context.Response.ContentEncoding = System.Text.Encoding.UTF8; context.Response.Write( sTxt );}
Qui si può notare che la stringa riguardante ilcaching non viene mai distrutta fintanto chel'applicazione non viene fatta ripartire. Ad ogni modoè possibile inserire una stringa con unaCacheDependency. Per approfondimenti si legga l'articoloASP.NET caching control.
Note conclusive
Se si aggiungono articoli con caratteri particolari (come levirgolette, ecc) il documento XML potrebbe non esser valido.Per rimediare al problema è sufficiente aggiungere unasezione CDATA come quella seguente:
oBuilder.Append("<item>");oBuilder.Append("<title><![CDATA[ ");oBuilder.Append( sTitle);oBuilder.Append(" ]]> </title>");oBuilder.Append("<link>");oBuilder.Append(sLink);oBuilder.Append("</link>");oBuilder.Append("<guid isPermaLink="true">");oBuilder.Append(sLink);oBuilder.Append("</guid>");oBuilder.Append("<description><![CDATA[ ");oBuilder.Append(sDescription);oBuilder.Append(" ]]> </description>");oBuilder.Append("<pubDate>");oBuilder.Append(sPubDate);oBuilder.Append("</pubDate>");oBuilder.Append("</item>");
- Articolo precedente Novitą e caratteristiche di ASP.NET 3.5: le principali nuove funzionalitą
- Articolo successivo Inviare email con allegati