Como você recomendaria lidar com RSS Feeds na 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?
Como você recomendaria lidar com RSS Feeds na 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?
Respostas:
Aqui está o que eu recomendo:
Depois de alterar o tipo de conteúdo para rss, você desejará serializar os dados em RSS (usando seu próprio código ou outra biblioteca) e escrever na resposta.
Crie uma ação em um controlador que deseja retornar rss e defina o tipo de retorno como RssResult. Pegue os dados do seu modelo com base no que você deseja retornar.
Então, qualquer solicitação para esta ação receberá rss de quaisquer dados que você escolher.
Essa é provavelmente a maneira mais rápida e reutilizável de retornar o rss como uma resposta a uma solicitação na ASP.NET MVC.
base("application/rss+xml")
e evitar as etapas 3 e 4. Ele substitui ExecuteResult, mas não é vital. Ele também atalhos de um monte de código normalmente-caseira e utiliza os 3.5+ características SyndicateItem
, SyndicateFeed
e Rss20FeedFormatter
.
O .NET framework expõe classes que lidam com sindicação: SyndicationFeed etc. Então, em vez de fazer a renderização você mesmo ou usar alguma outra biblioteca RSS sugerida, por que não deixar o framework cuidar disso?
Basicamente, você só precisa do seguinte ActionResult personalizado e está pronto para começar:
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 de controle, você pode simplesmente retornar o seguinte:
return new RssActionResult() { Feed = myFeedInstance };
Há um exemplo completo em meu blog em http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/
Eu concordo com Haacked. Atualmente, estou implementando meu site / blog usando a estrutura MVC e optei pela abordagem simples de criar uma nova visualização 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 obter mais informações, consulte (plug sem vergonha) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc
Outra abordagem maluca, mas com sua vantagem, é usar uma visualização normal .aspx para renderizar o RSS. Em seu método de ação, basta definir o tipo de conteúdo apropriado. O único benefício dessa abordagem é que é fácil entender o que está sendo renderizado e como adicionar elementos personalizados, como geolocalização.
Então, novamente, as outras abordagens listadas podem ser melhores, eu apenas não as usei. ;)
Eu consegui isso de Eran Kampf e um vídeo de Scott Hanselman (esqueci o link), então é apenas um pouco diferente de alguns outros posts aqui, mas espero que seja útil e copie e cole pronto como um feed de rss de exemplo.
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()));
}