RSS源在ASP.NET MVC

你会如何推荐在ASP.NET MVC中处理RSS提要? 使用第三方库? 在BCL中使用RSS的东西? 只需制作一个呈现XML的RSS视图? 或者完全不同的东西?

这是我build议的:

  1. 创build一个名为RssResult的类,该类inheritance了抽象基类ActionResult。
  2. 覆盖ExecuteResult方法。
  3. ExecuteResult具有由调用者传递给它的ControllerContext,并且可以获取数据和内容types。
  4. 将内容types更改为rss后,您需要将数据序列化为RSS(使用自己的代码或其他库)并写入响应。

  5. 在要返回rss的控制器上创build一个操作,并将返回types设置为RssResult。 根据您想要返回的数据从您的模型中获取数据。

  6. 然后,对此操作的任何请求都将收到您select的任何数据的rss。

这可能是最快和可重用的方式返回rss有一个响应ASP.NET MVC中的请求。

.NET框架公开了处理联合的类:SyndicationFeed等等。所以不是自己做渲染或者使用其他一些build议的RSS库,为什么不让框架来处理呢?

基本上你只需要下面的自定义ActionResult,你准备好了:

 public class RssActionResult : ActionResult { public SyndicationFeed Feed { get; set; } public override void ExecuteResult(ControllerContext context) { context.HttpContext.Response.ContentType = "application/rss+xml"; Rss20FeedFormatter rssFormatter = new Rss20FeedFormatter(Feed); using (XmlWriter writer = XmlWriter.Create(context.HttpContext.Response.Output)) { rssFormatter.WriteTo(writer); } } } 

现在在你的控制器动作,你可以简单地返回以下内容:

 return new RssActionResult() { Feed = myFeedInstance }; 

我的博客上有一个完整的示例: http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/

我同意哈克德。 我目前正在使用MVC框架实现我的网站/博客,并采用创build新的View for RSS的简单方法:

 <%@ Page ContentType="application/rss+xml" Language="C#" AutoEventWireup="true" CodeBehind="PostRSS.aspx.cs" Inherits="rr.web.Views.Blog.PostRSS" %><?xml version="1.0" encoding="utf-8"?> <rss version="2.0"> <channel> <title>ricky rosario's blog</title> <link>http://<%= Request.Url.Host %></link> <description>Blog RSS feed for rickyrosario.com</description> <lastBuildDate><%= ViewData.Model.First().DatePublished.Value.ToUniversalTime().ToString("r") %></lastBuildDate> <language>en-us</language> <% foreach (Post p in ViewData.Model) { %> <item> <title><%= Html.Encode(p.Title) %></title> <link>http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %></link> <guid>http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %></guid> <pubDate><%= p.DatePublished.Value.ToUniversalTime().ToString("r") %></pubDate> <description><%= Html.Encode(p.Content) %></description> </item> <% } %> </channel> </rss> 

欲了解更多信息,检查(无耻插件) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

另一个疯狂的方法,但有其优点,是使用一个正常的.aspx视图来呈现RSS。 在您的操作方法中,只需设置适当的内容types。 这种方法的一个好处是很容易理解正在呈现什么以及如何添加自定义元素,如地理定位。

再次,列出的其他方法可能会更好,我只是没有使用它们。 ;)

我从Eran Kampf和Scott Hanselman vid那里得到了这个(忘记了链接),所以和这里的一些其他post只是略有不同,但是希望有帮助,并且复制粘贴准备作为一个例子rss feed。

从我的博客

Eran Kampf

 using System; using System.Collections.Generic; using System.ServiceModel.Syndication; using System.Web; using System.Web.Mvc; using System.Xml; namespace MVC3JavaScript_3_2012.Rss { public class RssFeed : FileResult { private Uri _currentUrl; private readonly string _title; private readonly string _description; private readonly List<SyndicationItem> _items; public RssFeed(string contentType, string title, string description, List<SyndicationItem> items) : base(contentType) { _title = title; _description = description; _items = items; } protected override void WriteFile(HttpResponseBase response) { var feed = new SyndicationFeed(title: this._title, description: _description, feedAlternateLink: _currentUrl, items: this._items); var formatter = new Rss20FeedFormatter(feed); using (var writer = XmlWriter.Create(response.Output)) { formatter.WriteTo(writer); } } public override void ExecuteResult(ControllerContext context) { _currentUrl = context.RequestContext.HttpContext.Request.Url; base.ExecuteResult(context); } } } 

和控制器代码….

  [HttpGet] public ActionResult RssFeed() { var items = new List<SyndicationItem>(); for (int i = 0; i < 20; i++) { var item = new SyndicationItem() { Id = Guid.NewGuid().ToString(), Title = SyndicationContent.CreatePlaintextContent(String.Format("My Title {0}", Guid.NewGuid())), Content = SyndicationContent.CreateHtmlContent("Content The stuff."), PublishDate = DateTime.Now }; item.Links.Add(SyndicationLink.CreateAlternateLink(new Uri("http://www.google.com")));//Nothing alternate about it. It is the MAIN link for the item. items.Add(item); } return new RssFeed(title: "Greatness", items: items, contentType: "application/rss+xml", description: String.Format("Sooper Dooper {0}", Guid.NewGuid())); }