ASP.NET 使用 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);
}
}
}
最后上一张效果图:

ASP.NET 使用 SyndicationFeed 输出 Rss的更多相关文章
- 使用 SyndicationFeed 输出 Rss
以前生成 RSS 都是使用拼接 Xml 的方式生成的,不仅麻烦而且还不规范. #region 输出指定分类编号的消息源内容... /// <summary> /// 输出指定分类编号的消息 ...
- 为ASP.NET MVC视图输出json
做个小小练习,为asp.net mvc视图输出json字符串: 创建JsonResult操作: 创建此视图: 浏览结果:
- asp.net webapi自定义输出结果类似Response.Write()
asp.net webapi自定义输出结果类似Response.Write() [HttpGet] public HttpResponseMessage HelloWorld() { string ...
- 在 ASP.NET MVC Web 应用程序中输出 RSS Feeds
RSS全称Really Simple Syndication.一些更新频率较高的网站可以通过RSS让订阅者快速获取更新信息.RSS文档需遵守XML规范的,其中必需包含标题.链接.描述信息,还可以包含发 ...
- ASP.Net 更新页面输出缓存的几种方法
ASP.Net 自带的缓存机制对于提高页面性能有至关重要的作用,另一方面,缓存的使用也会造成信息更新的延迟.如何快速更新缓存数据,有时成了困扰程序员的难题.根据我的使用经验,总结了下面几种方法,概括了 ...
- asp,asp.net 以表格输出excel,数据默认科学计数的解决办法
关键字: style="vnd.ms-excel.numberformat:@" 问题:在用table仿excel生成中经常遇到类似于身份证的长整数类型excel默认当成科学计数 ...
- Asp.Net MVC5 格式化输出时间日期
刚好用到这个,网上找的全部是输出文本框内容的格式化日期时间 而我需要只是在一个表格中的单元个中输出单纯的文字 最后在MSDN上找到 HtmlHelper.FormatValue 方法 public s ...
- ASP.NET中常用输出JS脚本的类(来自于周公博客)
using System; using System.Collections.Generic; using System.Text; using System.Web; using System.We ...
- ASP.NET后台怎么输出方法中间调试信息?
后台方法,不止是aspx.cs,而是页面调用的一些其它方法.想调试这些方法,我以前winform都是MessageBox.Show一些中间结果,现在我也想用这种方式.但想想,网页会触发 Message ...
随机推荐
- 临界区代码 critical section Locks and critical sections in multiple threads
临界区 在同步的程序设计中,临界区段(Critical section)指的是一个访问共享资源(例如:共享设备或是共享存储器)的程序片段,而这些共享资源有无法同时被多个线程访问的特性. 当有线程进入临 ...
- spring (反射+代理+DI+AOP)
spring https://baijiahao.baidu.com/s?id=1620606848227713760&wfr=spider&for=pc 反射 https://bl ...
- 为Viewgourp内组件添加动画
package com.loaderman.customviewdemo; import android.animation.Keyframe; import android.animation.La ...
- (二)第一个Servlet
一.预备知识 一.Servlet简介 Servlet是sun公司提供的一门用于开发动态web资源的技术. Sun公司在其API中提供了一个servlet接口,用户若想用发一个动态web资源(即开发一个 ...
- iOS面试考察点
)自我介绍.项目经历.专业知识.自由提问 (2)准备简历.投发简历.笔试(电话面试.).面试.复试.终面试.试用.转正.发展.跳槽(加薪升职) 1闲聊 a)自我介绍:自我认识能力 b)评价上一家公司: ...
- python 日志组件
日志组件: import logging import logging.handlers import os class logs(object): def __init__(self): self. ...
- linux下的进程间通信之消息队列
概念: 进程彼此之间可以通过IPC消息进行通信.进程产生的每条消息都被发送到一个IPC消息队列中,这条消息一直存放在队列中,直到另一个进程将其读走为止. 优点:可以通过发送消息来几乎完全避免命名管道的 ...
- Andrew Ng机器学习课程15
Andrew Ng机器学习课程15 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:主要介绍了主成分分析,从基本的直观观念出发逐渐推导至公式化的描述,得 ...
- 网络编程(socket).WinSocket_recvfrom出错,GetLastError()为10054
1.在写 我的Qt598(vs2017)x64版本的 shadowsocks程序时遇到的. 具体问题情况 大概是这样:QUdpSocket(假设是sktA) connect接收函数,sktA侦听 端口 ...
- 性能优化-Bitmap内存管理及优化
Bitmap作为重要Android应用之一,在很多时候如果应用不当,很容易造成内存溢出,那么这篇文章的目的就在于探讨Bitmap的有效运用及其优化 缓存介绍 当多次发送请求的时候,请求同一内容,为了使 ...