Consuming Feeds with the .NET Syndication API

Consuming Feeds with the .NET Syndication API

  • Comments 1

One of the nicest (and very under-advertised) features to make it into .NET framework 3.5 was the new Syndication API (http://msdn.microsoft.com/en-us/library/system.servicemodel.syndication.aspx). The Syndication API provides .NET applications a great way to consume and publish RSS and Atom feeds. If you've been paying attention to Azure lately you will have realised that Atom forms a major part of Azure and Live services in the cloud. Syndication feeds (Atom/RSS) are fast emerging as the de facto way for applications to update interested parties about changes in state, news and any other updates. There's a good reason for this. Feeds allow consumers (that's you and me) to control when, where and how often to receive updates.

Without further ado, let me present some sample code to consume an RSS feed using the Syndication API:

XmlReader reader = XmlReader.Create("http://blogs.msdn.com/knowledgecast/rss.xml");
Rss20FeedFormatter rss = new Rss20FeedFormatter();
if (rss.CanRead(reader))

  rss.ReadFrom(reader); 
  var items = from item in rss.Feed.Items.OfType<SyndicationItem>() 
                   select new 
                   { 
                      Title = item.Title.Text, 
                      Url = item.Links.First<SyndicationLink>().Uri.AbsoluteUri 
                   };

  lstFeedTitles.DataSource = items; 
  lstFeedTitles.DataBind();
}

reader.Close();

We open an XmlReader with the RSS feed for this blog as URL. We then create an Rss20FeedFormatter (System.ServiceModel.Syndication.Rss20FeedFormatter) and use the CanRead method to verify that the feed loaded in our XmlReader is an RSS feed. The ReadFrom method reads the feed into the feed formatter.

Now things start to get really interesting. I use a clever LINQ query to slurp out the Title and Url of the post into a collection. Note that the objects in this collection all use an anonymouse type that is defined inside the LINQ query. We then bind the resulting collection (which should be an IEnumerable) to a DataList we have sitting in our ASPX page. Here's what our ASPX form looks like:

<form id="form1" runat="server">
    <div>
    <ul>
    <asp:DataList ID="lstFeedTitles" runat="server">
        <ItemTemplate>
         <li>
            <asp:LinkButton ID="lnkTitle" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Title")%>' PostBackUrl='<%# DataBinder.Eval(Container.DataItem, "Url")%>' />
         </li>  
        </ItemTemplate>
    </asp:DataList>
    </ul>
    </div>
    </form>

And voila! You have your very own super simple RSS feed reader. It's almost too easy :) Here's what the rendered page looks like:

  • Silverlight 2: So Close I Can Taste It
  • Phew! It's Been a Busy Month
  • Encrypting Configuration Settings in .NET 2.0
  • Using VisualTransition with a Silverlight Content Control
  • Assigning a Name to a Silverlight Element
  • Writing a Silverlight Content Control
  • Microsoft SQL Server 2005 Express Edition with Advanced Services
  • Quick Guide to Silverlight 2 Beta 2
  • Quick Guide to Silverlight 2 Beta 1
  • Are you an aspiring architect?
  • Windows Mobile Power Savers
  • Windows XP Service Pack 3 released
  • Biztalk Server 2006 R3 announced
  • Paste As Text 1.0
  • TechReady 5

    To get this code to work with a proxy server, you can run the XmlReader off a WebClient instead of a direct URL. Here's how you'd do that:

    WebClient wc = new WebClient();
    WebProxy proxy = new WebProxy("myproxy.corp.com", true);
    wc.Proxy = proxy;
    wc.Credentials = CredentialCache.DefaultCredentials;
    Stream s = wc.OpenRead("http://blogs.msdn.com/knowledgecast/rss.xml");

    XmlReader reader = XmlReader.Create(s);

    //Syndication API code here

  • Leave a Comment
    • Please add 3 and 5 and type the answer here:
    • Post