ASP.NET MVC中的RSS源

时间:2020-03-05 18:39:48  来源:igfitidea点击:

我们如何建议在ASP.NET MVC中处理RSS Feed?使用第三方图书馆?在BCL中使用RSS内容?只是制作一个呈现XML的RSS视图?还是完全不同的东西?

解决方案

回答

这是我的建议:

  • 创建一个名为RssResult的类,该类继承了抽象基类ActionResult。
  • 重写ExecuteResult方法。
  • ExecuteResult由调用者传递给ControllerContext,我们可以借此获取数据和内容类型。
  • 将内容类型更改为rss后,我们将需要将数据序列化为RSS(使用我们自己的代码或者其他库)并写入响应。
  • 在要返回rss的控制器上创建一个动作,并将返回类型设置为RssResult。根据我们要返回的内容从模型中获取数据。
  • 然后,对该操作的任何请求都将收到我们选择的任何数据的rss。

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

回答

另一种疯狂的方法却有其优势,那就是使用普通的.aspx视图来呈现RSS。在操作方法中,只需设置适当的内容类型。这种方法的一个好处是很容易理解正在渲染的内容以及如何添加自定义元素(例如地理位置)。

再说一遍,列出的其他方法可能更好,我只是没有使用过。 ;)

回答

我同意哈克德的观点。我目前正在使用MVC框架来实现我的站点/博客,并且采用了为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

回答

.NET框架公开了处理联合的类:SyndicationFeed等。
因此,为什么不自己做渲染或者使用其他建议的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/