以前生成 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的更多相关文章

  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学习笔记(三)快速创建实体 EntityCreater

    一.实体简介 实体用于在 Microsoft Dynamics CRM 中建立业务数据模型和管理业务数据.例如,可以使用客户.市场活动和事件(案例)等实体跟踪和支持销售.市场营销和服务活动.实体具有一 ...

  2. Queue插入的时候报错:源数组长度不足。请检查 srcIndex 和长度以及数组的下限。

    异常问题记录: 本想自己手动实现一个日志记录功能.使用Queue队列集合来实现多线程的日志记录. 测试 一个线程写入数据Enqueue和一个线程读取数据Dequeue ,直接用的无休眠死循环. 终于抛 ...

  3. 体验应用程序在Mac/iPhone/iPad之间的Handoff

    对于苹果新推出的Handoff功能,之前只体验了接电话的Handoff.一个电话打过来,iPhone/iPad/Mac同时响起,这时如果手上拿着东西在吃,就可以直接在Mac上接电话. 除此之外,还可以 ...

  4. Oracle 删除大表中部分数据

    需求: 项目中有一张表大概有7000多万条数据,造成表空间已满,需要清理部分数据,打算清理3000万. 2B 做法: delete from table_name where ID > '400 ...

  5. Leetcode 67 Add Binary 大数加法+字符串处理

    题意:两个二进制数相加,大数加法的变形 大数加法流程: 1.倒置两个大数,这一步能使所有大数对齐 2.逐位相加,同时进位 3.倒置两个大数的和作为输出 class Solution { public: ...

  6. Windows Server 安装 BitLocker

    打开PowerShell(管理员): C:\> Install-WindowsFeature BitLocker -Restart 安装好后,系统会自动重新启动. Windows Server ...

  7. Android Studio导入github下载的工程

    现在从github上面现在的项目大部分都是Android Studio工程,那么问题来了,从github上面down一个工程下来,怎么导入android studio呢? 对刚从eclipse转And ...

  8. Installing Oracle and ArcSDE on separate servers

    http://help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//002n0000000q000000

  9. eclipse,myeclipse开发环境下,maven远程部署到tomcat7服务器(图文)

    有的人想在eclipse写java web 项目,通过maven也是一种实现的方法,可以实现java web 项目打包成war,发布到tomcat. 在pom.xml文件的build增加下面的代码,相 ...

  10. crond: unrecognized service 无crond解决办法

    运行计划任务时:service crond restart提示:crond: unrecognized service安装计划任务:yum -y install vixie-cron 另外附计划任务的 ...