Pergunta

Como você recomendaria lidar com RSS Feeds no ASP.NET MVC?Usando uma biblioteca de terceiros?Usando o material RSS no BCL?Apenas fazendo uma visualização RSS que renderiza o XML?Ou algo completamente diferente?

Foi útil?

Solução

Aqui está o que eu recomendo:

  1. Crie uma classe chamada RssResult que herda fora da classe base abstrata ActionResult.
  2. Substitua o método ExecuteResult.
  3. ExecuteResult tem a ControllerContext passado para ele pelo chamador e com isso, você pode obter os dados e tipo de conteúdo.
  4. Uma vez que você alterar o tipo de conteúdo para rss, você vai querer serializar os dados para RSS (usando seu próprio código ou outra biblioteca) e escrever a resposta.

  5. Criar uma ação em um controlador que pretende voltar rss e definir o tipo de retorno como RssResult. Pegue os dados do seu modelo com base no que você deseja retornar.

  6. Em seguida, qualquer solicitação para esta ação receberá rss de todos os dados que você escolher.

Essa é provavelmente a maneira mais rápida e reutilizável de voltar rss tem uma resposta a um pedido no ASP.NET MVC.

Outras dicas

O framework .NET expõe classes que syndation punho: SyndicationFeed etc. Então, ao invés de fazer o mesmo renderização ou usando algum outro biblioteca sugerida RSS por que não deixar os cuidados quadro take dele?

Basicamente, você só precisa do seguinte ActionResult personalizado e você está pronto para ir:

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

Agora, em sua ação do controlador pode simples retorno ao seguinte:

return new RssActionResult() { Feed = myFeedInstance };

Há uma amostra completa no meu blog em http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/

Eu concordo com Haacked. Estou actualmente a implementar o meu site / blog usando o framework MVC e eu fui com a abordagem simples de criar uma nova vista para 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>

Para mais informações, check-out (plug descarado) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

Outra abordagem louco, mas tem a sua vantagem, é usar uma vista normal aspx para tornar o RSS. No seu método de ação, basta definir o tipo de conteúdo apropriado. A única vantagem dessa abordagem é que é fácil de entender o que está sendo processado e como adicionar elementos personalizados, como geolocalização.

Por outro lado, as outras abordagens da lista poderia ser melhor, eu só não usei-los. ;)

Eu tenho esse de Eran Kampf e uma vid Scott Hanselman (esqueci o link) por isso é apenas um pouco diferente de alguns outros posts aqui, mas espero que útil e copiar e colar pronto como um exemplo rss feed.

do meu blog

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

E o código do controlador ....

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

}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top