Sätt upp ett RSS-flöde

RSS står för Really Simple Syndication och är en XML-dialekt som följer XML 1.0-specifikationen. RSS är av de nya beståndsdelarna i den "nya webben" och har blivit väldigt populärt på senare tid. Användare kan med egna RSS-läsare, prenumenera på innehåll från en webbplats. Fördelen är enorm genom att man kan från en samlad plats se exakt vilka av ens favoritsajter som har skrivit något nytt. RSS skapar även möjligheten för olika nyhetssajter att publicera innehåll från en annan webbsida.

Jag använde artikeln "Skapa en RSS-feed för din webbplats" som inspiration. Jag skrev om den för att passa till ASP.NET C# samt att jag i mitt kodexempel skriver en fysisk xml fil direkt på hårddisken. I exemplet på Dileno.com läggs xml-filen i cache. Min funktion som skapar ett RSS-flöde av posterna i min blogg och ser ut ungefär så här.

//Funktion som skapar RSS flöde
protected void GenerateRss()
{
try
{

//Fysisk sökväg på servern (Byt ut mot den på din server)
string strXMLPath = "C:/ . . . /rss.xml";

FileStream objFileStream = new FileStream(strXMLPath,FileMode.Create);
XmlTextWriter xtw = new XmlTextWriter(objFileStream,System.Text.Encoding.GetEncoding("iso-8859-1"));
xtw.Formatting = Formatting.Indented;
xtw.WriteStartDocument();

//skriv ut <rss version="2.0">
xtw.WriteStartElement("rss");
xtw.WriteAttributeString("version","2.0");

//skriv ut <channel>
xtw.WriteStartElement("channel");

//skriv ut element som tillhör <channel>
xtw.WriteElementString("title","Codeodyssey.se");
xtw.WriteElementString("link","http://www.codeodyssey.se/");
xtw.WriteElementString("description","Code Odyssey - expanderar webben");
xtw.WriteElementString("language","sv-SE");
xtw.WriteElementString("copyright","Copyright (c) 2004-2006 Code Odyssey");

OleDbConnection conn = new OleDbConnection (strConn);
bool boolPermission = false;
OleDbDataReader objDataReader=null;
try
{
string strSQL = "SELECT Blog.Id, Blog.Title, Blog.Body, Blog.PublishDate FROM Blog ORDER BY Blog.PublishDate DESC";

conn.Open();

OleDbCommand objCommand = new OleDbCommand(strSQL, conn);
objDataReader = objCommand.ExecuteReader();
while (objDataReader.Read() == true)
{
int Id = Convert.ToInt32(objDataReader["Id"]);
string Title = Convert.ToString(objDataReader["Title"]);
string Body= Convert.ToString(objDataReader["Body"]);
//Se till att datum följer RFC-822 standard
string PublishDate = Convert.ToString( ((DateTime)objDataReader["PublishDate"]).ToString("r"));


//skriv ut <item> och dess innehåll
xtw.WriteStartElement("item");
xtw.WriteElementString("title",Title);
xtw.WriteElementString("link","http://www." + strUrl.ToLower() + "/Blog.aspx?id=" + Id);
xtw.WriteElementString("guid","http://www." + strUrl.ToLower() + "/Blog.aspx?id=" + Id);
xtw.WriteElementString("description",Body);
xtw.WriteElementString("pubDate",PublishDate);
xtw.WriteEndElement();
}
objCommand.Dispose();
}
catch (Exception objException)
{
Trace.Warn("GenerateRss() Fel!",objException.Message);
}
finally
{
if(objDataReader!=null)
{
objDataReader.Close();  
}
conn.Close();
}

//skriv ut </channel>
xtw.WriteEndElement();

//skriv ut </rss>
xtw.WriteEndElement();

//Stäng xml skrivaren
xtw.Close();
}
catch (Exception objException)
{
Trace.Warn("GenerateRss() Fel!",objException.Message);
}
}

Visa RSS för läsaren
Sen är det dags att lägga till en länk så att Firefox (och antagligen IE7) ska kunna se att din webbplats innehåller ett RSS-flöde och visa detta med den lilla RSS ikonen.

Denna tagg ser ut så här:

<link rel="alternate" type="application/rss+xml" title="RSS 2.0" href="xml/rss.xml" />

Vill man lägga till en länk till RSS från koden kan man göra så här:

//Lägg till RSS länk
HtmlLink link = new HtmlLink();
link.Attributes.Add("type", "application/rss+xml");
link.Attributes.Add("rel", "alternate");
link.Attributes.Add("href", "feed/rss.xml");
this.Page.Header.Controls.Add(link);

Bilder i RSS?
Först tänkte jag visa de bilder i mitt RSS-flöde men efter ha läst "RSS - bra eller dåligt?" så ångrade jag mig. Speciellt om man ska prenumenera på RSS genom en mobiltelefon så vill man ju inte ladda med en massa bilder i onödan.

Validera bloggen
Till sist är det dags att prova så att allt fungerar som det ska. Mozilla Thunderbirds inbyggda RSS läsare fungerar utmärkt till detta. Eller aktiva bokmärken i Firefox. Man bör även validera CSS-flödet, en valideringstjänst finns på Feedvalidator.org.

By Jesper Lind

Validera mot webbstandarder

Att se till att en hemsida följer webbstandarderna från W3C är väldigt viktigt ifall man vill att designen ska fungerar bra på alla olika läsare. Annars förlitar man sig på hur bra (och hur) läsaren hanterar felen. Resultatet kan då variera stort.

Måste erkänna att jag aldrig direkt har kämpat för detta tidigare. Webben har helt enkelt känts för "trasig" för att man ska orka bry sig. Men när nu IE7 är på gång och Microsoft verkar ta webbstandarderna på allvar, så känns det värt att börja rensa sina egna alster från icke-validerad kod. Okej då kör vi!

1. Validera som XHMTL Transitional
Nu lyckade jag för första gången skapa en webbsida (den här bloggen) som validerar som XHTML 1.0 Transitional.

Valid XHTML 1.0 Transitional

Min startsida som innehåller flash blev dock lite svårare att få att validera som XHTML pågrund av att den innehåller en flashfilm. Hittade en bra artikel på ämnet men den hjälpte mig tyvärr inte hela vägen.

Denna sida har fortfarande några fel i DOCTYPE Strict men det tar jag en annan dag... Här finns en länk om skillnaderna mellan transitional och strict och ytterligare läsning om varför det är så viktigt att ange en korrekt DOCTYPE.

2. Validera som giltig CSS
Nästa steg blir CSS validering, detta gick ju fint också.

Valid CSS!

Fick dock en hel del varningar - bland annat som säger "You have no color with your background-color" och liknade. Detta beror på de nya W3C reglerna som introducerades nyligen. Att följa dessa kan dock skapa en del oväntade effekter. Så jag väljer att ha kvar varningarna - de är du endå bara varningar.

3. Validera ett RSS-flöde
RSS-flödet i min blogg är också riktig. Fick en varning på kodningen:

"Your feed appears to be encoded as "iso-8859-1", but your server is reporting "US-ASCII""

Detta såg jag många som haft problem med men hittade ingen lösning.

[Valid RSS]

By Jesper Lind