Pregunta

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

¿Fue útil?

Solución

Esto es lo que recomiendo:

  1. Cree una clase llamada RSSRESULT que hereda el resumen de ActionResult de clase base.
  2. Anule el método ExecuteResult.
  3. La persona que llama le pasa el ControllerContext a ExecuteResult 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 en 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 devolución como RssResult.Tome los datos de su modelo en función de lo que desea devolver.

  6. Luego, cualquier solicitud para esta acción recibirá rss de los datos que elija.

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

Otros consejos

El marco .NET expone clases que manejan la sindificación:SindicaciónFeed, etc.Entonces, en lugar de realizar el renderizado usted mismo o utilizar alguna otra biblioteca RSS sugerida, ¿por qué no dejar que el marco se encargue de ello?

Básicamente, solo necesitas el siguiente ActionResult personalizado y estará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 tu controlador puedes 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 marco 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" %><?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/creando-un-rss-feed-in-asp-net-mvc

Otro enfoque loco, pero que 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 un video de Scott Hanselman (olvidé el enlace), por lo que es ligeramente diferente de otras publicaciones aquí, pero espero que sea útil y esté listo para copiar y pegar como ejemplo de fuente 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<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()));

}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top