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


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

5 111

5 ответов:

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

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

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

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

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

платформа .NET framework предоставляет классы, которые обрабатывают syndation: 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/

Я согласен с 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'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-каналов. В методе действия просто установите соответствующий тип контента. Одним из преимуществ этого подхода является то, что легко понять, что визуализируется и как добавить пользовательские элементы, такие как геолокация.

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

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

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

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

}