RSS-каналы в ASP.NET MVC

Как бы вы рекомендовали обработать RSS-каналы в ASP.NET MVC? Использование сторонней библиотеки? Использование материалов RSS в BCL? Просто создайте представление RSS, которое отображает XML? Или что-то совсем другое?

Ответ 1

Вот что я рекомендую:

  • Создайте класс RssResult, который наследует абстрактный базовый класс ActionResult.
  • Переопределить метод ExecuteResult.
  • ExecuteResult имеет ControllerContext, переданный ему вызывающим, и с этим вы можете получить данные и тип контента.
  • Как только вы измените тип контента на rss, вам захочется сериализовать данные в RSS (используя собственный код или другую библиотеку) и написать ответ.

  • Создайте действие над контроллером, который вы хотите вернуть rss, и установите тип возврата как RssResult. Возьмите данные из своей модели на основе того, что вы хотите вернуть.

  • Тогда любой запрос на это действие получит rss любых данных, которые вы выберете.

Это, вероятно, самый быстрый и многоразовый способ возврата. rss имеет ответ на запрос в ASP.NET MVC.

Ответ 2

Структура .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/

Ответ 3

Я согласен с Haacked. В настоящее время я реализую свой сайт/блог с использованием структуры 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 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

Ответ 4

Другим сумасшедшим подходом, но имеет преимущество, является использование обычного .aspx-представления для рендеринга RSS. В своем методе действий просто установите соответствующий тип содержимого. Одно из преимуществ этого подхода заключается в том, что легко понять, что отображается, и как добавлять настраиваемые элементы, такие как геолокация.

И снова другие перечисленные подходы могут быть лучше, я просто не использовал их.;)

Ответ 5

Я получил это от Eran Kampf и Scott Hanselman vid (забыл ссылку), поэтому он немного отличается от некоторых других сообщений здесь, но, надеюсь, полезен и скопирован в качестве примера rss-канала.

Из моего блога

Эран Кампф

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()));

}