ASP.NET MVC中的RSS源

ASP.NET MVC中的RSS源

RSS Feeds in ASP.NET MVC

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


.NET框架公开了处理联合的类:SyndicationFeed等。
因此,为什么不自己做渲染或使用其他建议的RSS库,为什么不让框架来处理呢?

基本上,您只需要以下自定义ActionResult即可开始使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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);
        }
    }
}

现在,在控制器操作中,您可以简单地返回以下内容:

1
return new RssActionResult() { Feed = myFeedInstance };

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


这是我的建议:

  • 创建一个名为RssResult的类
    继承抽象基类
    动作结果。
  • 重写ExecuteResult方法。
  • ExecuteResult由调用者传递给ControllerContext,您可以借此获取数据和内容类型。
  • 将内容类型更改为rss后,您将需要将数据序列化为RSS(使用您自己的代码或其他库)并写入响应。

  • 在要返回rss的控制器上创建一个动作,并将返回类型设置为RssResult。根据要返回的内容从模型中获取数据。

  • 然后,对该操作的任何请求都会收到您选择的任何数据的rss。

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


    我同意哈克德的观点。我目前正在使用MVC框架来实现我的站点/博客,并且采用了创建RSS新视图的简单方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <%@ 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>
    ricky rosario's blog
    <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>
        <%= Html.Encode(p.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。在您的操作方法中,只需设置适当的内容类型。这种方法的一个好处是很容易理解正在渲染的内容以及如何添加自定义元素(例如地理位置)。

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


    我是从Eran Kampf和Scott Hanselman vid(忘记链接)那里获得的,因此它与此处的其他帖子仅略有不同,但希望会有所帮助,并准备好粘贴粘贴作为rss feed示例。

    从我的博客

    伊兰·坎普夫

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    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);
            }
        }
    }

    还有控制器代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
        [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()));

    }


    推荐阅读