This blog was missing the third most important feature of a blog: RSS. (The first two most important features are posts and comments because a blog without comments is not a blog. I am still waiting for comments on this blog but I am sure it will take time.)
There are probably many ultra fancy ways to create an RSS feed using existing libraries for .Net. For example, one could create a new ActionResult that returned RSS: RssResult (analogous to JsonResult for returning JSON). This isn't rocket science, so I decided to keep it simple and just create a new View for RSS.
The first step was to create a new Action in my Blog Controller that retrieves the latest (12 in my case) posts and passes them on to the View:
public ActionResult PostFeed(string type) {
if (type.ToLower().Equals("rss")) {
return View("PostRSS", _blogService.GetPosts(0,12));
} else {
return RedirectToAction("Index", "Home");
}
}
The (syndication) type is passed in so that I can easily add Atom or any other format in the future. If an invalid type is passed in then I just redirect the user to the home page. Maybe I should redirect to the RSS feed instead?
The next step is to create the View (PostRSS.aspx), which is simply a template for the RSS XML with a foreach loop to go through the posts. Note that I had to put the <?xml ... ?> declaration on the same line and to the right of the <%@ Page ... %>. Otherwise, a blank line is rendered at the top of the page and the XML becomes invalid :-|.
<%@ Page ContentType="application/rss+xml" Language="C#" AutoEventWireup="true" CodeBehind="PostRSS.aspx.cs" Inherits="rr.web.Views.Blog.PostRSS" %><?xml version="1.0" encoding="utf-8"?>
<rss version="2.0">
<channel>
<title>ricky rosario's blog</title>
<link>http://<%= Request.Url.Host %></link>
<description>Blog RSS feed for rickyrosario.com</description>
<lastBuildDate><%= ViewData.Model.First().DatePublished.Value.ToUniversalTime().ToString("r") %></lastBuildDate>
<language>en-us</language>
<% foreach (Post p in ViewData.Model) { %>
<item>
<title><%= Html.Encode(p.Title) %></title>
<link>http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %></link>
<guid>http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %></guid>
<pubDate><%= p.DatePublished.Value.ToUniversalTime().ToString("r") %></pubDate>
<description><%= Html.Encode(p.Content) %></description>
</item>
<% } %>
</channel>
</rss>
After this you can add a route if you want to customize your feed URL to be something like yoursite.com/feed/rss/:
routes.MapRoute(
"PostFeed",
"Feed/{type}",
new { controller = "Blog", action = "PostFeed", type = "rss" }
);
That's it! Most bloggers seem to use feedburner to manage their RSS feeds, so I did that as well and it was very straightforward. They provide a bunch of HTML snippets to advertise your feed.
BTW, writing this post is making me realize how bad I need to integrate some kind of editor for creating blog posts, rather than typing into a textarea and manually encoding the xml code above. I also need to pick a syntax highlighter and plug it in for easier reading. Nobody is reading yet though, so it's ok ;).

0 Responses to "Creating an RSS Feed in ASP.NET MVC"
Please note that some responses may require approval before appearing.