以前生成 RSS 都是使用拼接 Xml 的方式生成的,不仅麻烦而且还不规范。

  1. #region 输出指定分类编号的消息源内容...
  2.  
  3. /// <summary>
  4. /// 输出指定分类编号的消息源内容。
  5. /// </summary>
  6. public void OutputFeed()
  7. {
  8. //int categoryId, string customUrl
  9. int categoryId = 0;
  10. string customUrl = string.Empty;
  11. if (!string.IsNullOrEmpty(RequestUtility.GetQueryString("CategoryId")))
  12. {
  13. categoryId = Convert.ToInt32(RequestUtility.GetQueryString("CategoryId"));
  14. }
  15. if (!string.IsNullOrEmpty(RequestUtility.GetQueryString("Custom")))
  16. {
  17. customUrl = RequestUtility.GetQueryString("Custom");
  18. }
  19. StringBuilder xml = new StringBuilder();
  20. xml.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
  21. xml.Append("<rss version=\"2.0\">\n");
  22. xml.Append("<channel>\n");
  23. CategoryInfo category = new CategoryInfo();
  24. if (categoryId == 0 && string.IsNullOrEmpty(customUrl))
  25. {
  26. xml.AppendFormat("<title>{0}</title>\n", string.Format(MemoryCacheProvider.GetLanguage("WebRssTitle", WeilogContext.Current.Application.Prefix), SettingInfo.Name));
  27. }
  28. else if (categoryId == 0 && !string.IsNullOrEmpty(customUrl))
  29. {
  30. category = CategoryService.GetCategory(Provider, customUrl);
  31. xml.AppendFormat("<title>{0}</title>\n", string.Format(MemoryCacheProvider.GetLanguage("WebCategoryRssTitle", WeilogContext.Current.Application.Prefix), category.Name, SettingInfo.Name));
  32. }
  33. else
  34. {
  35. category = CategoryService.GetCategory(Provider, categoryId);
  36. xml.AppendFormat("<title>{0}</title>\n", string.Format(MemoryCacheProvider.GetLanguage("WebCategoryRssTitle", WeilogContext.Current.Application.Prefix), category.Name, SettingInfo.Name));
  37. }
  38. xml.AppendFormat("<link>{0}</link>\n", SettingInfo.Url);
  39. xml.AppendFormat("<description>{0}</description>\n", SettingInfo.Description);
  40. xml.AppendFormat("<language>{0}</language>\n", SettingInfo.Language);// <language>zh-cn</language>
  41. xml.AppendFormat("<copyright>{0}</copyright>\n", "Copyright " + SettingInfo.Name);
  42. xml.AppendFormat("<webMaster>{0}</webMaster>\n", SettingInfo.SmtpMail);
  43. xml.AppendFormat("<generator>{0}</generator>\n", WeilogContext.Current.Application.FullVersion);
  44. xml.Append("<image>\n");
  45. xml.AppendFormat("\t<title>{0}</title>\n", SettingInfo.Name);
  46. xml.AppendFormat("\t<url>{0}</url>\n", "/Common/Images/Logo.jpg");
  47. xml.AppendFormat("\t<link>{0}</link>\n", SettingInfo.Url);
  48. xml.AppendFormat("\t<description>{0}</description>\n", SettingInfo.Description);
  49. xml.Append("</image>\n");
  50. int totalRecords = 0;
  51. List<PostInfo> articleList = new List<PostInfo>();
  52. articleList = PostService.GetPostList(base.Provider, categoryId, null, null, PostType.Post, null, null, null, OrderField.ByPublishTime, OrderType.Desc, 1, 20, out totalRecords);
  53. foreach (PostInfo item in articleList)
  54. {
  55. xml.Append("<item>\n");
  56. xml.AppendFormat("\t<link>{0}</link>\n", string.Format(SitePath.PostLinkFormat, SettingInfo.Url, item.Locator));
  57. xml.AppendFormat("\t<title>{0}</title>\n", item.Title);
  58. xml.AppendFormat("\t<author>{0}</author>\n", item.AuthorName);
  59. xml.AppendFormat("\t<category>{0}</category>\n", CategoryService.GetCategory(Provider, item.CategoryId).Name);
  60. xml.AppendFormat("\t<pubDate>{0}</pubDate>\n", item.PublishTime);
  61. //xml.AppendFormat("\t<guid>{0}</guid>\n", string.Format(WebPath.PostLinkFormat, SettingInfo.Url, item.CustomUrl));
  62. 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)));
  63. xml.Append("</item>\n");
  64. }
  65. xml.Append("</channel>\n");
  66. xml.Append("</rss>");
  67. HttpContext.Current.Response.ContentType = "text/xml";
  68. HttpContext.Current.Response.Write(xml);
  69. }
  70.  
  71. #endregion

前段时间看老外的项目里用到了 SyndicationFeed 这个类来生成 Rss,索性自己做项目的时候也用了一下,果然事半功倍,只需要简洁的代码便可输出 Rss。我的项目是 MVC 的。

  1. /// <summary>
  2. /// 文章订阅。
  3. /// </summary>
  4. /// <returns>视图的执行结果。</returns>
  5. public ActionResult PostFeed()
  6. {
  7. var feed = new SyndicationFeed(
  8. base.Settings["Name"].ToString(),
  9. base.Settings["Description"].ToString(),
  10. new Uri(Settings["Url"].ToString()),
  11. "BlogRSS",
  12. DateTime.UtcNow);
  13.  
  14. if (!(bool)Settings["Status"])
  15. return new FeedActionResult() { Feed = feed };
  16.  
  17. var items = new List<SyndicationItem>();
  18. var posts = PostService.GetPostList(Provider, Data.Common.OrderField.ByPublishTime, Data.Common.OrderType.Desc, 20);
  19. foreach (var post in posts)
  20. {
  21. string blogPostUrl = Url.RouteUrl("Post", new { Id = post.Id }, "http");
  22. items.Add(new SyndicationItem(post.Title, post.Content, new Uri(blogPostUrl), String.Format("Blog:{0}", post.Id), post.PublishTime));
  23. }
  24. feed.Items = items;
  25. return new FeedResult() { Feed = feed };
  26. }

FeedResult 是一个自定义的 ActionResult 类:

  1. /// <summary>
  2. /// 封装一个 RSS 源操作方法的结果并用于代表该操作方法执行框架级操作。
  3. /// </summary>
  4. public class FeedResult : ActionResult
  5. {
  6. /// <summary>
  7. /// 声明 RSS 源对象。
  8. /// </summary>
  9. public SyndicationFeed Feed { get; set; }
  10.  
  11. /// <summary>
  12. /// 初始化 <see cref="FeedResult"/> 类的新实例。
  13. /// </summary>
  14. public FeedResult()
  15. {
  16. }
  17.  
  18. /// <summary>
  19. /// 通过从 System.Web.Mvc.ActionResult 类继承的自定义类型,启用对操作方法结果的处理。
  20. /// </summary>
  21. /// <param name="context">用于执行结果的上下文。 上下文信息包括控制器、HTTP 内容、请求上下文和路由数据。</param>
  22. public override void ExecuteResult(ControllerContext context)
  23. {
  24. context.HttpContext.Response.ContentType = "application/rss+xml";
  25.  
  26. var rssFormatter = new Rss20FeedFormatter(Feed);
  27. using (var writer = XmlWriter.Create(context.HttpContext.Response.Output))
  28. {
  29. rssFormatter.WriteTo(writer);
  30. }
  31. }
  32. }

最后上一张效果图:

使用 SyndicationFeed 输出 Rss的更多相关文章

  1. ASP.NET 使用 SyndicationFeed 输出 Rss

    以前生成 RSS 都是使用拼接 Xml 的方式生成的,不仅麻烦而且还不规范. #region 输出指定分类编号的消息源内容... /// <summary> /// 输出指定分类编号的消息 ...

  2. 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds

    RSS全称Really Simple Syndication.一些更新频率较高的网站可以通过RSS让订阅者快速获取更新信息.RSS文档需遵守XML规范的,其中必需包含标题.链接.描述信息,还可以包含发 ...

  3. RSS与公众号

    这次怀念下曾经火热的RSS.RSS是我很喜欢的一种看信息学习的方式,但是这项技术随着谷歌reader产品的停止已经陨落了.之后再无给力的客户端,无法让人愉悦的使用.我也曾尝试用鲜果,有道等国内产品,由 ...

  4. java使用Rome解析Rss的实例(转)

    Rome简介 Rome是为RSS聚合而开发的开源包,它可以支持0.91.0.92.0.93.0.94.1.0.2.0,可以说rss的版本基本上都支持了. Rss简介 RSS是站点用来和其他站点之间共享 ...

  5. [知识库分享系列] 二、.NET(ASP.NET)

    最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...

  6. Python+Django+SAE系列教程15-----输出非HTML内容(图片/PDF)

    一个Django视图函数 必须 接受一个HttpRequest 实例作为它的第一个參数 返回一个HttpResponse 实例 从一个视图返回一个非HTML 内容的关键是在构造一个 HttpRespo ...

  7. Perl的调试方法

    来源: http://my.oschina.net/alphajay/blog/52172 http://www.cnblogs.com/baiyanhuang/archive/2009/11/09/ ...

  8. js内存深入学习(二)

    继上一篇文章 js内存深入学习(一) 3. 内存泄漏 对于持续运行的服务进程(daemon),必须及时释放不再用到的内存.否则,内存占用越来越高,轻则影响系统性能,重则导致进程崩溃. 对于不再用到的内 ...

  9. 【进阶1-4期】JavaScript深入之带你走进内存机制(转)

    这是我在公众号(高级前端进阶)看到的文章,现在做笔记 https://mp.weixin.qq.com/s/yK4DPKhkmkiroasWJMrJcw 阅读笔记 JS内存空间分为栈(stack).堆 ...

随机推荐

  1. Dynamic CRM 2013学习笔记(四十四)CRM技术支持

    有时我们经常遇到一些CRM的问题,一时又无法解决,这时我们可能要找下外援,下面列出一些基本的技术支持.   1. CRM 论坛 https://community.dynamics.com/crm/f ...

  2. 移动App的REST API设计实践

    原文:http://www.jianshu.com/p/23cccb3a90b1 通讯协议 一些只是对服务器数据进行CRUD操作的App,通常采用HTTP协议,为了安全也可以采用HTTPS协议.IM软 ...

  3. Nim教程【一】

    这应该是国内第一个关于Nim入门的系列教程 什么是Nim 我们先来引述网友 Luikore的一段话: Nim 不是函数式的, 但 Nim 支持卫生宏, 可以做 AST 重写, 可以自定编译规则, 是静 ...

  4. Ubuntu下postgresql安装

    第一步:在Ubuntu下安装Postgresql         1.使用 apt-get install 安装          zhang@ubuntu:~/protgresql#sudo apt ...

  5. Java-基础练习3

    1.编写一个Java程序,计算半径为3.0的圆周长和面积并输出结果.把圆周率π定义为常量,半径定义为变量,然后进行计算并输出结果. package com.java; public class zm ...

  6. java封装性

    原先是class Person{ public string name; public  int age } public void main{ Person person=new person(); ...

  7. 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,.. ...

  8. iframeWin For Easy UI. 为 Easy UI 扩展的支持IFrame插件

    iframeWin For Easy UI. 为 Easy UI 扩展的支持IFrame插件 在一个项目中用了Easy UI,但是发现里面的 Dialog .Window.Messager 弹窗都不支 ...

  9. QQ邮箱的安全问题

    下午同事群里有人提醒,小心欺诈邮件.邮件内容为你的帐户在XX存在异地登录,已经进入了[保护模式],如需解除请点击[解除保护模式] 除了链接之外,其它跟官方的是一模一样,包括标题. 那个链接的地址是:h ...

  10. gson 自定义对象转换格式

    有时候我们希望gson按照我们想要的方式转换,比如将日期转换为时间戳 class GsonBuilderUtil { public static Gson create() { GsonBuilder ...