using System; using System.Collections.Generic; using System.ServiceModel.Syndication; using System.Web; using System.Xml; public class FeedHandler : IHttpHandler { public void ProcessRequest(HttpContext context) { SyndicationFeed feed = new SyndicationFeed() { Title = new TextSyndicationContent(Blog.Title), Description = new TextSyndicationContent("Latest blog posts"), BaseUri = new Uri(context.Request.Url.Scheme + "://" + context.Request.Url.Authority), Items = GetItems(), }; feed.Links.Add(new SyndicationLink(feed.BaseUri)); using (var writer = new XmlTextWriter(context.Response.Output)) { var formatter = GetFormatter(context, feed); formatter.WriteTo(writer); } context.Response.ContentType = "text/xml"; } private IEnumerable GetItems() { foreach (Post p in Blog.GetPosts(10)) { var item = new SyndicationItem(p.Title, p.Content, p.AbsoluteUrl, p.AbsoluteUrl.ToString(), p.LastModified); item.Authors.Add(new SyndicationPerson("", p.Author, "")); yield return item; } } private SyndicationFeedFormatter GetFormatter(HttpContext context, SyndicationFeed feed) { string path = context.Request.Path.Trim('/'); int index = path.LastIndexOf('/'); if (index > -1 && path.Substring(index + 1) == "atom") { context.Response.ContentType = "application/atom+xml"; return new Atom10FeedFormatter(feed); } context.Response.ContentType = "application/rss+xml"; return new Rss20FeedFormatter(feed); } public bool IsReusable { get { return false; } } }