Fuentes RSS en ASP.NET MVC

¿Cómo recomendaría el manejo de fonts RSS en ASP.NET MVC? ¿Usando una biblioteca de terceros? ¿Usando el material RSS en el BCL? ¿Simplemente haciendo una vista RSS que represente el XML? ¿O algo completamente diferente?

Esto es lo que recomiendo:

  1. Cree una clase llamada RssResult que hereda de la clase base abstracta ActionResult.
  2. Reemplazar el método ExecuteResult.
  3. ExecuteResult tiene el ControllerContext pasado por la persona que llama y con esto puede obtener los datos y el tipo de contenido.
  4. Una vez que cambie el tipo de contenido a rss, querrá serializar los datos a RSS (usando su propio código u otra biblioteca) y escribir en la respuesta.

  5. Cree una acción en un controlador que desee devolver rss y establezca el tipo de retorno como RssResult. Obtenga los datos de su modelo en función de lo que desea devolver.

  6. Luego, cualquier solicitud a esta acción recibirá rss de cualquier información que elija.

Esa es probablemente la forma más rápida y reutilizable de devolver rss. Tiene una respuesta a una solicitud en ASP.NET MVC.

El .NET Framework expone las clases que manejan la sincronización: SyndicationFeed, etc. Entonces, en lugar de hacer el renderizado usted mismo o usar alguna otra biblioteca RSS sugerida, ¿por qué no dejar que el marco se ocupe de ello?

Básicamente, solo necesitas el siguiente ActionResult personalizado y estás listo para comenzar:

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

Ahora en la acción de su controlador puede simplemente devolver lo siguiente:

 return new RssActionResult() { Feed = myFeedInstance }; 

Hay una muestra completa en mi blog en http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/

Estoy de acuerdo con Haacked. Actualmente estoy implementando mi sitio / blog usando el framework MVC y opté por el enfoque simple de crear una nueva Vista para RSS:

 <%@ Page ContentType="application/rss+xml" Language="C#" AutoEventWireup="true" CodeBehind="PostRSS.aspx.cs" Inherits="rr.web.Views.Blog.PostRSS" %>   ricky rosario's blog http://<%= Request.Url.Host %> Blog RSS feed for rickyrosario.com <%= ViewData.Model.First().DatePublished.Value.ToUniversalTime().ToString("r") %> en-us <% foreach (Post p in ViewData.Model) { %>  <%= Html.Encode(p.Title) %> http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %> http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %> <%= p.DatePublished.Value.ToUniversalTime().ToString("r") %> <%= Html.Encode(p.Content) %>  <% } %>   

Para obtener más información, consulte (plug desvergonzado) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

Otro enfoque loco, pero tiene su ventaja, es utilizar una vista .aspx normal para representar el RSS. En su método de acción, simplemente configure el tipo de contenido apropiado. El único beneficio de este enfoque es que es fácil entender qué se está representando y cómo agregar elementos personalizados, como la geolocalización.

Por otra parte, los otros enfoques enumerados podrían ser mejores, simplemente no los he usado. 😉

Obtuve esto de Eran Kampf y de Scott Hanselman vid (se olvidó el enlace), por lo que es un poco diferente de algunas otras publicaciones aquí, pero espero que sea útil y copie la opción de pegar como un ejemplo de RSS.

De mi 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 _items; public RssFeed(string contentType, string title, string description, List 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); } } } 

Y el código del controlador ….

  [HttpGet] public ActionResult RssFeed() { var items = new List(); 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())); }