|
|
- 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<SyndicationItem> 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; }
- }
- }
|