You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

59 lines
1.8 KiB

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