Jag bloggar numera på http://blog.dileno.com ».

Prenumerera på RSS

Skapa ett RSS-flöde i ASP.NET

Att skapa ett RSS-flöde i ASP.NET är inga problem. Däremot finns det en mängd olika tillvägagångssätt och det är inte alltid lätt att veta hur man ska skapa sitt flöde. Jag visar dig hur du skapar ett lättviktigt RSS-flöde genom att använda en ashx-handler i ASP.NET.

Kort om ashx-handlers

När man använder sig av en aspx-sida för att visa innehåll så sker ett antal anrop, bland annat till Web.Config och IIS:en. När det är HTML som ska visas på en webbsida så är det naturligt att använda sig av en vanlig aspx-sida, men aspx-sidor behövs inte för att visa exempelvis XML - och det är här den mer lättviktiga ashx-handlern kommer in. En ashx-handler skapar helt enkelt inte lika många anrop som en aspx-sida och är därför bättre att använda sig av för att visa exempelvis simpel XML-data.

Skapa en ashx-handler för RSS-flödet

I Visual Studio, högerklicka på ditt projekt, välj Add new item, gå till Web och välj Generic Handler. Döp filen till Rss.ashx. Se bild.

Två metoder skapas, ProcessRequest och IsReusable. Det är i ProcessRequest som koden sedan körs för en ashx handler, motsvarande Page_Load för vanliga aspx-sidor.

RSS-specifikation och exempel

För att vårt RSS-flöde ska tolkas korrekt av webbläsare och andra klientet som läser av RSS-flödet så behöver flödet vara ett XML-dokument med ett antal element som krävs av RSS-formatet. För att få grundläggande teori kring RSS-formatet föreslår jag att du läser RSS-specifikationen och kikar på hur själva XML-dokumentet ska se ut.

Använd XmlWriter i ASP.NET för att bygga RSS-flödet

För att bygga vårt RSS-flöde kommer vi att använda oss av XmlWriter-objektet i ASP.NET. XmlWriter är riktigt smidigt att jobba med och har allt vi behöver.

För att vara säkra på det verkligen är XML som skrivs ut i vår ashx-handler och att det är rätt format så behöver vi först lägga till två rader i ProcessRequest-metoden:

HttpContext.Current.Response.Clear();
HttpContext.Current.Response.ContentType = "text/xml";

Vi rensar Response-bufferten och talar om att utdatat ska vara i XML-format. Sedan kombinerar jag MemoryStream och StreamWriter för att börja skriva ut RSS-flödet med hjälp av XmlWriter-objektet. Så här:

MemoryStream ms = new MemoryStream();
StreamWriter objWriter = new StreamWriter(ms);

XmlWriter objXml = XmlWriter.Create(objWriter, settings);

objXml.WriteStartDocument();
objXml.WriteStartElement("rss");
objXml.WriteAttributeString("version", "2.0");
objXml.WriteStartElement("channel");
objXml.WriteElementString("title", _siteTitle);
objXml.WriteElementString("link", _siteUrl);
objXml.WriteElementString("description", "RSS för tio senaste inläggen på " + _siteTitle);
objXml.WriteElementString("copyright", "© Martin Söderlund");
objXml.WriteElementString("ttl", "15");

Ovanstående kod skapar själva huvudet för RSS-flödet, med XML- och RSS-deklaration, samt grundläggande information om vad RSS-flödet innehåller. Det mesta är ganska så självbeskrivande. ttl talar om hur ofta det ska vara tillåtet för RSS-läsare att läsa av ditt RSS-flöde. I ovanstående exempel är detta satt till 15 minuter.

Det som dock utgör huvuddelen av RSS-flödet måste kopplas samman med en datakälla, såsom en XML-fil eller oftare en databas som innehåller det vi vill skriva ut i RSS-flödet.

Hämta information från databas och skriv till RSS-flödet

För att hämta data från databasen använder jag mig av SqlDataReader, loopar igenom resultatet jag får från min SQL-fråga och skriver XML till RSS-flödet med hjälp av XmlWriter. Notera att jag använder mig av WriteCData-metoden när jag skriver ut själva inlägget. Detta är för att HTML ska visas korrekt i RSS-flödet och slutligen i olika RSS-läsare.

Kod för att hämta tio inlägg från en databas och lägga till i RSS-flödet:

string strSQL = "SELECT TOP 10 id,heading,intro,entry,url,dt FROM tblEntries ORDER BY id DESC";
SqlConnection objConn = new SqlConnection(ConfigurationManager.ConnectionStrings["dbEntries"].ConnectionString);
SqlCommand objCmd = new SqlCommand(strSQL, objConn);

try
{
objConn.Open();
SqlDataReader sdr = objCmd.ExecuteReader();

while (sdr.Read())
{
objXml.WriteStartElement("item");
objXml.WriteStartElement("title");
objXml.WriteCData(sdr.GetValue(1).ToString());
objXml.WriteEndElement();
objXml.WriteElementString("link", _siteUrl + "entry.aspx?id=" + sdr["id"].ToString());
objXml.WriteStartElement("description");
objXml.WriteCData(sdr["intro"].ToString() + sdr["entry"].ToString());
objXml.WriteEndElement();
objXml.WriteElementString("guid", _siteUrl + "entry.aspx?id=" + sdr["id"].ToString());
objXml.WriteElementString("pubDate", Convert.ToDateTime(sdr["dt"]).ToString("R"));
objXml.WriteEndElement();
}
}

catch { }
finally
{
objConn.Close();
}

Cacha RSS-flödet

Det är en god idé att cacha RSS-flödet för att öka prestanda. Som du såg tidigare kan man ange hur ofta en RSS-läsare ska läsa av ditt flöde, men detta är ingen garanti för god prestanda. I stället bör man använda sig av ASP.NETs inbyggda cachning.

RSS-flödet cachar du enkelt med följande kodsnutt, där rssFeed innehållet det vi ska cacha:

HttpContext.Current.Cache.Insert(_feedCacheName, rssFeed, null, DateTime.Now.AddHours(8), TimeSpan.Zero);

Vi skapar ett cacheobjekt som heter RssFeedCache och talar om att cachen ska gälla i åtta timmar. Sedan kan du använda följande kod när du vill läsa från cachen:

Object objFeed = context.Cache.Get(_feedCacheName);

if (objFeed == null) CreateFeedCache();

HttpContext.Current.Response.Write(context.Cache.Get(_feedCacheName).ToString());

Det kan också vara en god idé att använda sig av Remove-metoden för att radera cacheobjektet. Remove är användbart när nytt innehåll lagts till som du vill ska hamna i RSS-flödet. Du når metoden genom Cache.Remove("RssFeedCache").

Komplett kodlistning och nedladdning

Komplett kodlistning för ashx-handlern, med vissa modifikationer för smartare implementation, kan du titta på hos pastebin och ladda ner:

Till sidhuvudet

Clicky Web Analytics