.Net3.5创建RSS
2010-08-10 10:27 空逸云 阅读(279) 评论(0) 编辑 收藏 举报在之前,创建RSS必须要手动调用XML API生成XML,LINQ to XML的出现大大减少了工作量(可参考LINQ构建RSS).然而.在.Net3.5中.微软提供了更方便快捷的API.详见System.ServiceModel.Syndicatio命名空间但是.我们使用到的只有 SyndicationFeed 类,SyndicationItem 类 ,Rss20FeedFormatter 类. RSS的标准协议还是比较杂的.对于这方面不甚了解的同学.可以参考关于 Blog 和 RSS 的全面介绍 .
首先.我们看一段RSS示例
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/">
- <channel>
<title>博客园-空逸云</title>
<link>http://www.cnblogs.com/kongyiyun/</link>
<description>路漫漫其修远兮,吾将上下而求索.</description>
<language>zh-cn</language>
<lastBuildDate>Tue, 10 Aug 2010 02:00:54 GMT</lastBuildDate>
<pubDate>Tue, 10 Aug 2010 02:00:54 GMT</pubDate>
<ttl>60</ttl>
- <item>
<title>星级评分公式</title>
<link>http://www.cnblogs.com/kongyiyun/archive/2010/08/06/1794441.html</link>
<dc:creator>空逸云</dc:creator>
<author>空逸云</author>
<pubDate>Fri, 06 Aug 2010 13:31:00 GMT</pubDate>
<guid>http://www.cnblogs.com/kongyiyun/archive/2010/08/06/1794441.html</guid>
- <description>
- <![CDATA[ <p>作者: <a href="http://www.cnblogs.com/kongyiyun/" target="_blank">空逸云</a> 发表于 2010-08-06 21:31 <a href="http://www.cnblogs.com/kongyiyun/archive/2010/08/06/1794441.html" target="_blank">原文链接</a> 阅读: 6 评论: 0</p>.....
]]>
</description>
</item>
</channel>
</rss>
再比较MSDN.不难发现.必要有一个channel节.其中包含有title,link,description等属性.再下.每个item就是我们所要呈现的重要内容.在这里.重点就是SyndicationFeed 类和SyndicationItem类.我的实现如下.
首先建立了一个RssBuilder类.用于创建必要的SyndicationFeed.
/// <summary>
/// </summary>
public class RssBuilder
{
private int itemAmount = ACookContext.Current.ACookSettingsConfig.RssAmount;
private int _userId = 0;
public RssBuilder() { }
public RssBuilder(int userId) { _userId = userId; }
public SyndicationFeed BuildRss()
{
var recipes = GetSources();
var ctx = ACookContext.Current;
string feedTitle = string.Format("{0} {1}'s Rss", ctx.ACookSettingsConfig.SiteName, _userId == 0 ? string.Empty : ctx.ACookAppConfig.Author);
string targetUrl = string.Format("{0}/{1}", ctx.ACookSettingsConfig.DomainName, ctx.ACookAppConfig.Application);
SyndicationFeed feed = new SyndicationFeed(feedTitle, "ACook's Rss", new Uri(targetUrl), "What's this?", DateTime.Now)
{
Language = "zh-cn"
};
List<SyndicationItem> items = new List<SyndicationItem>();
foreach (var x in recipes)
{
SyndicationItem item = new SyndicationItem(x.RecipeTitle, x.CookSteps, new Uri(string.Format("http://www.acook.cc/recipe/{0}.aspx", x.RecipeId)), x.RecipeSample, x.PTime);
item.Categories.Add(new SyndicationCategory(x.Category.CategoryTitle));
item.Authors.Add(new SyndicationPerson(x.Publisher.Author));
items.Add(item);
}
feed.Items = items;
return feed;
}
private string BuildContent(ACookRecipe recipe)
{
//TODO:生成页面的呈现内容
return recipe.CookSteps;
}
private IEnumerable<ACookRecipe> GetSources()
{
//TODO:获取数据源,
}
}
然后.再创建一个Rss.cs IHttpHandler类.此处要引用System.ServiceModel.Web程序集,用户呈现RSS内容实现如下.
public void ProcessRequest(HttpContext context)
{
RssBuilder builder = new RssBuilder(ACookContext.Current.ACookAppConfig.UserId);
var feed = builder.BuildRss();
context.Response.ContentType = "text/xml";
Rss20FeedFormatter rssfm = new Rss20FeedFormatter(feed);
XmlWriter rssWriter = new XmlTextWriter(context.Response.OutputStream, System.Text.Encoding.UTF8);
rssfm.WriteTo(rssWriter);
rssWriter.Close();
}
由于是要呈现于页面当中.我们就是用了Response.OutputStream,如果是写入XML文件中.可以可以XmlWriter.Create("rss.xml");
最后.再在WebConfig的HttpHandlers节中加入
add verb="*" path="rss.rss" type="ACook.FrameWork.Handler.Rss,ACook.FrameWork"/>
即可.
好了.现在我们来访问我们创建的RSS吧.
出处:http://kongyiyun.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。