¿Cómo recomendaría manejar las fuentes RSS en ASP.NET MVC? ¿Utilizas una biblioteca de terceros? ¿Estás usando el material RSS en la BCL? ¿Solo está creando una vista RSS que muestre el XML? ¿O algo completamente diferente?
¿Cómo recomendaría manejar las fuentes RSS en ASP.NET MVC? ¿Utilizas una biblioteca de terceros? ¿Estás usando el material RSS en la BCL? ¿Solo está creando una vista RSS que muestre el XML? ¿O algo completamente diferente?
Respuestas:
Esto es lo que recomiendo:
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.
Cree una acción en un controlador que desee devolver rss y establezca el tipo de retorno como RssResult. Toma los datos de tu modelo en función de lo que quieras devolver.
Entonces, cualquier solicitud a esta acción recibirá rss de los datos 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.
base("application/rss+xml")
y evitar los pasos 3 y 4. Él anula ExecuteResult, pero no es vital. También atajos de una gran cantidad de código típicamente de andar por casa y utiliza las características de 3.5 + SyndicateItem
, SyndicateFeed
y Rss20FeedFormatter
.
El marco .NET expone 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 encargue de ello?
Básicamente, solo necesita el siguiente ActionResult personalizado y está 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 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 utilizando el marco MVC y seguí 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" %><?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 obtener más información, consulte (enchufe descarado) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc
Otro enfoque loco, pero tiene su ventaja, es usar una vista .aspx normal para renderizar 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 comprender qué se está renderizando 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 un video de Scott Hanselman (olvidé el enlace), por lo que es solo un poco diferente de algunas otras publicaciones aquí, pero con suerte es útil y está listo para copiar y pegar como un ejemplo de feed 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);
}
}
}
Y el código del 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()));
}