使用 SyndicationFeed 输出 Rss
以前生成 RSS 都是使用拼接 Xml 的方式生成的,不仅麻烦而且还不规范。
#region 输出指定分类编号的消息源内容...
/// <summary>
/// 输出指定分类编号的消息源内容。
/// </summary>
public void OutputFeed()
{
//int categoryId, string customUrl
int categoryId = 0;
string customUrl = string.Empty;
if (!string.IsNullOrEmpty(RequestUtility.GetQueryString("CategoryId")))
{
categoryId = Convert.ToInt32(RequestUtility.GetQueryString("CategoryId"));
}
if (!string.IsNullOrEmpty(RequestUtility.GetQueryString("Custom")))
{
customUrl = RequestUtility.GetQueryString("Custom");
}
StringBuilder xml = new StringBuilder();
xml.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
xml.Append("<rss version=\"2.0\">\n");
xml.Append("<channel>\n");
CategoryInfo category = new CategoryInfo();
if (categoryId == 0 && string.IsNullOrEmpty(customUrl))
{
xml.AppendFormat("<title>{0}</title>\n", string.Format(MemoryCacheProvider.GetLanguage("WebRssTitle", WeilogContext.Current.Application.Prefix), SettingInfo.Name));
}
else if (categoryId == 0 && !string.IsNullOrEmpty(customUrl))
{
category = CategoryService.GetCategory(Provider, customUrl);
xml.AppendFormat("<title>{0}</title>\n", string.Format(MemoryCacheProvider.GetLanguage("WebCategoryRssTitle", WeilogContext.Current.Application.Prefix), category.Name, SettingInfo.Name));
}
else
{
category = CategoryService.GetCategory(Provider, categoryId);
xml.AppendFormat("<title>{0}</title>\n", string.Format(MemoryCacheProvider.GetLanguage("WebCategoryRssTitle", WeilogContext.Current.Application.Prefix), category.Name, SettingInfo.Name));
}
xml.AppendFormat("<link>{0}</link>\n", SettingInfo.Url);
xml.AppendFormat("<description>{0}</description>\n", SettingInfo.Description);
xml.AppendFormat("<language>{0}</language>\n", SettingInfo.Language);// <language>zh-cn</language>
xml.AppendFormat("<copyright>{0}</copyright>\n", "Copyright " + SettingInfo.Name);
xml.AppendFormat("<webMaster>{0}</webMaster>\n", SettingInfo.SmtpMail);
xml.AppendFormat("<generator>{0}</generator>\n", WeilogContext.Current.Application.FullVersion);
xml.Append("<image>\n");
xml.AppendFormat("\t<title>{0}</title>\n", SettingInfo.Name);
xml.AppendFormat("\t<url>{0}</url>\n", "/Common/Images/Logo.jpg");
xml.AppendFormat("\t<link>{0}</link>\n", SettingInfo.Url);
xml.AppendFormat("\t<description>{0}</description>\n", SettingInfo.Description);
xml.Append("</image>\n");
int totalRecords = 0;
List<PostInfo> articleList = new List<PostInfo>();
articleList = PostService.GetPostList(base.Provider, categoryId, null, null, PostType.Post, null, null, null, OrderField.ByPublishTime, OrderType.Desc, 1, 20, out totalRecords);
foreach (PostInfo item in articleList)
{
xml.Append("<item>\n");
xml.AppendFormat("\t<link>{0}</link>\n", string.Format(SitePath.PostLinkFormat, SettingInfo.Url, item.Locator));
xml.AppendFormat("\t<title>{0}</title>\n", item.Title);
xml.AppendFormat("\t<author>{0}</author>\n", item.AuthorName);
xml.AppendFormat("\t<category>{0}</category>\n", CategoryService.GetCategory(Provider, item.CategoryId).Name);
xml.AppendFormat("\t<pubDate>{0}</pubDate>\n", item.PublishTime);
//xml.AppendFormat("\t<guid>{0}</guid>\n", string.Format(WebPath.PostLinkFormat, SettingInfo.Url, item.CustomUrl));
xml.AppendFormat("\t<description>{0}</description>\n", StringUtil.CDATA(string.IsNullOrEmpty(item.Password) ? (SettingInfo.RssType == 0 ? item.Excerpt : item.Content) : MemoryCacheProvider.GetLanguage("MsgEncContent", WeilogContext.Current.Application.Prefix)));
xml.Append("</item>\n");
}
xml.Append("</channel>\n");
xml.Append("</rss>");
HttpContext.Current.Response.ContentType = "text/xml";
HttpContext.Current.Response.Write(xml);
}
#endregion
前段时间看老外的项目里用到了 SyndicationFeed 这个类来生成 Rss,索性自己做项目的时候也用了一下,果然事半功倍,只需要简洁的代码便可输出 Rss。我的项目是 MVC 的。
/// <summary>
/// 文章订阅。
/// </summary>
/// <returns>视图的执行结果。</returns>
public ActionResult PostFeed()
{
var feed = new SyndicationFeed(
base.Settings["Name"].ToString(),
base.Settings["Description"].ToString(),
new Uri(Settings["Url"].ToString()),
"BlogRSS",
DateTime.UtcNow); if (!(bool)Settings["Status"])
return new FeedActionResult() { Feed = feed }; var items = new List<SyndicationItem>();
var posts = PostService.GetPostList(Provider, Data.Common.OrderField.ByPublishTime, Data.Common.OrderType.Desc, 20);
foreach (var post in posts)
{
string blogPostUrl = Url.RouteUrl("Post", new { Id = post.Id }, "http");
items.Add(new SyndicationItem(post.Title, post.Content, new Uri(blogPostUrl), String.Format("Blog:{0}", post.Id), post.PublishTime));
}
feed.Items = items;
return new FeedResult() { Feed = feed };
}
FeedResult 是一个自定义的 ActionResult 类:
/// <summary>
/// 封装一个 RSS 源操作方法的结果并用于代表该操作方法执行框架级操作。
/// </summary>
public class FeedResult : ActionResult
{
/// <summary>
/// 声明 RSS 源对象。
/// </summary>
public SyndicationFeed Feed { get; set; } /// <summary>
/// 初始化 <see cref="FeedResult"/> 类的新实例。
/// </summary>
public FeedResult()
{
} /// <summary>
/// 通过从 System.Web.Mvc.ActionResult 类继承的自定义类型,启用对操作方法结果的处理。
/// </summary>
/// <param name="context">用于执行结果的上下文。 上下文信息包括控制器、HTTP 内容、请求上下文和路由数据。</param>
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.ContentType = "application/rss+xml"; var rssFormatter = new Rss20FeedFormatter(Feed);
using (var writer = XmlWriter.Create(context.HttpContext.Response.Output))
{
rssFormatter.WriteTo(writer);
}
}
}
最后上一张效果图:

使用 SyndicationFeed 输出 Rss的更多相关文章
- ASP.NET 使用 SyndicationFeed 输出 Rss
以前生成 RSS 都是使用拼接 Xml 的方式生成的,不仅麻烦而且还不规范. #region 输出指定分类编号的消息源内容... /// <summary> /// 输出指定分类编号的消息 ...
- 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds
RSS全称Really Simple Syndication.一些更新频率较高的网站可以通过RSS让订阅者快速获取更新信息.RSS文档需遵守XML规范的,其中必需包含标题.链接.描述信息,还可以包含发 ...
- RSS与公众号
这次怀念下曾经火热的RSS.RSS是我很喜欢的一种看信息学习的方式,但是这项技术随着谷歌reader产品的停止已经陨落了.之后再无给力的客户端,无法让人愉悦的使用.我也曾尝试用鲜果,有道等国内产品,由 ...
- java使用Rome解析Rss的实例(转)
Rome简介 Rome是为RSS聚合而开发的开源包,它可以支持0.91.0.92.0.93.0.94.1.0.2.0,可以说rss的版本基本上都支持了. Rss简介 RSS是站点用来和其他站点之间共享 ...
- [知识库分享系列] 二、.NET(ASP.NET)
最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...
- Python+Django+SAE系列教程15-----输出非HTML内容(图片/PDF)
一个Django视图函数 必须 接受一个HttpRequest 实例作为它的第一个參数 返回一个HttpResponse 实例 从一个视图返回一个非HTML 内容的关键是在构造一个 HttpRespo ...
- Perl的调试方法
来源: http://my.oschina.net/alphajay/blog/52172 http://www.cnblogs.com/baiyanhuang/archive/2009/11/09/ ...
- js内存深入学习(二)
继上一篇文章 js内存深入学习(一) 3. 内存泄漏 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存.否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃. 对于不再用到的内 ...
- 【进阶1-4期】JavaScript深入之带你走进内存机制(转)
这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/yK4DPKhkmkiroasWJMrJcw 阅读笔记 JS内存空间分为栈(stack).堆 ...
随机推荐
- centos7 安装 notejs
1.安装集成工具 yum -y install gcc make gcc-c++ 2.安装notejs 自行选择版本:https://nodejs.org/dist/ wget https://nod ...
- [ACM_数学] LA 3708 Graveyard [墓地雕塑 圈上新加点 找规律]
Description Programming contests became so popular in the year 2397 that the governor of New Earck ...
- 使用ConditionalScope进行高效的SharePoint CSOM编程
在上一篇文章中讲述了 ExceptionHandlingScope的使用后,本章主要讲述ConditionalScope的用法. ConditionalScope在设计思路和解决问题上同Excepti ...
- 大数据并行计算利器之MPI/OpenMP
大数据集群计算利器之MPI/OpenMP ---以连通域标记算法并行化为例 1 背景 图像连通域标记算法是从一幅栅格图像(通常为二值图像)中,将互相邻接(4邻接或8邻接)的具有非背景值的像素集合提取出 ...
- [读书笔记]C#学习笔记六: C#3.0Lambda表达式及Linq解析
前言 最早使用到Lambda表达式是因为一个需求:如果一个数组是:int[] s = new int[]{1,3,5,9,14,16,22};例如只想要这个数组中小于15的元素然后重新组装成一个数组或 ...
- Seo的几个境界
Seo的境界 第一层,弄些关键词排名上去. 是的,大部分人理解的Seoer,就到此为止 这里有技巧若干若干.很值得一些人去卖弄. 第二层,大量广泛的收录,很好的pr值 恭喜您,把握搜索长尾, 这种不显 ...
- Leetcode 189 Rotate Array stl
题意:将数组旋转k次,如将数组[1,2,3,4,5]旋转1次得到[2,3,4,5,1],将数组[1,2,3,4,5]旋转2次得到[3,4,5,1,2]..... 本质是将数组分成两部分a1,a2,.. ...
- 轻松了解Spring中的控制反转和依赖注入(二)
紧接上一篇文章<轻松了解Spring中的控制反转和依赖注入>讲解了SpringIOC和DI的基本概念,这篇文章我们模拟一下SpringIOC的工作机制,使我们更加深刻的理解其中的工作. 类 ...
- Inno Setup 卸载前关闭进程或服务 x86 x64
1.32位程序的PSVince.dll插件方法. [Setup] AppName=PSVince AppVerName=PSVince 1.0 DisableProgramGroupPage=true ...
- nodejs学习之表单提交(1)
nodejs作为一门后端语言,接触的最多的是它的框架,但是它本身的api我觉得更是非学不可,所有才有了这篇文章 表单提交是最基本的也是最实用的入门实例 HTML: <!DOCTYPE html& ...