使用 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).堆 ...
随机推荐
- Dynamic CRM 2013学习笔记(四十四)CRM技术支持
有时我们经常遇到一些CRM的问题,一时又无法解决,这时我们可能要找下外援,下面列出一些基本的技术支持. 1. CRM 论坛 https://community.dynamics.com/crm/f ...
- 移动App的REST API设计实践
原文:http://www.jianshu.com/p/23cccb3a90b1 通讯协议 一些只是对服务器数据进行CRUD操作的App,通常采用HTTP协议,为了安全也可以采用HTTPS协议.IM软 ...
- Nim教程【一】
这应该是国内第一个关于Nim入门的系列教程 什么是Nim 我们先来引述网友 Luikore的一段话: Nim 不是函数式的, 但 Nim 支持卫生宏, 可以做 AST 重写, 可以自定编译规则, 是静 ...
- Ubuntu下postgresql安装
第一步:在Ubuntu下安装Postgresql 1.使用 apt-get install 安装 zhang@ubuntu:~/protgresql#sudo apt ...
- Java-基础练习3
1.编写一个Java程序,计算半径为3.0的圆周长和面积并输出结果.把圆周率π定义为常量,半径定义为变量,然后进行计算并输出结果. package com.java; public class zm ...
- java封装性
原先是class Person{ public string name; public int age } public void main{ Person person=new person(); ...
- 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,.. ...
- iframeWin For Easy UI. 为 Easy UI 扩展的支持IFrame插件
iframeWin For Easy UI. 为 Easy UI 扩展的支持IFrame插件 在一个项目中用了Easy UI,但是发现里面的 Dialog .Window.Messager 弹窗都不支 ...
- QQ邮箱的安全问题
下午同事群里有人提醒,小心欺诈邮件.邮件内容为你的帐户在XX存在异地登录,已经进入了[保护模式],如需解除请点击[解除保护模式] 除了链接之外,其它跟官方的是一模一样,包括标题. 那个链接的地址是:h ...
- gson 自定义对象转换格式
有时候我们希望gson按照我们想要的方式转换,比如将日期转换为时间戳 class GsonBuilderUtil { public static Gson create() { GsonBuilder ...