114 votes

Flux RSS dans ASP.NET MVC

Comment recommanderiez-vous la gestion des flux RSS dans ASP.NET MVC? Utiliser une bibliothèque tierce? En utilisant le RSS dans la BCL? Juste faire une vue RSS qui rend le XML? Ou quelque chose de complètement différent?

150voto

Eran Kampf Points 3285

L' .NET framework expose des classes qui gèrent syndation: SyndicationFeed etc. Donc au lieu de faire le rendu vous-même ou en utilisant un autre a suggéré RSS de la bibliothèque pourquoi ne pas laisser le cadre de prendre soin d'elle?

Fondamentalement, vous avez juste besoin de la mesure suivante ActionResult et vous êtes prêt à aller:

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

Maintenant, dans votre action de contrôleur, vous pouvez simplement retourner les éléments suivants:

return new RssActionResult() { Feed = myFeedInstance };

Il y a un exemple complet sur mon blog à l' http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/

65voto

Dale Ragan Points 14495

Voici ce que je recommande:

  1. Créer une classe appelée RssResult que hérite au large de la classe de base abstraite ActionResult.
  2. Remplacer le ExecuteResult méthode.
  3. ExecuteResult a la ControllerContext passé par l'appelant et avec cela, vous pouvez obtenir les données et le type de contenu.
  4. Une fois que vous modifiez le type de contenu de flux rss, vous aurez envie de sérialiser les données de flux RSS (à l'aide de votre propre code ou d'une autre bibliothèque) et d'écrire la réponse.

  5. Créer une action sur un contrôleur que vous souhaitez renvoyer les flux rss et définissez le type de retour que RssResult. Saisir les données à partir de votre modèle en fonction de ce que vous voulez retourner.

  6. Puis toute demande à cette action permettra de recevoir les flux rss de toutes les données que vous choisissez.

C'est probablement le moyen le plus rapide et réutilisables voie de retour rss est une réponse à une demande dans ASP.NET MVC.

34voto

Ricky Points 3648

Je suis d'accord avec Haacked. Je suis actuellement en train d'implémenter mon site / blog en utilisant le framework MVC et je suis allé avec l'approche simple de créer un nouveau View pour 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>
 

Pour plus d'informations, consultez (fiche sans vergogne) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

13voto

Haacked Points 31070

Une autre approche folle, mais qui a son avantage, consiste à utiliser une vue .aspx normale pour rendre le RSS. Dans votre méthode d'action, définissez simplement le type de contenu approprié. L'avantage de cette approche est qu'il est facile de comprendre ce qui est rendu et comment ajouter des éléments personnalisés tels que la géolocalisation.

Là encore, les autres approches listées pourraient être meilleures, je ne les ai simplement pas utilisées. ;)

8voto

TheDev6 Points 397

J'ai obtenu ce à partir de Eran Kampf et un Scott, Hanselman vid (oublié le lien) il n'est donc légèrement différent de celui de certaines autres posts ici, mais je l'espère, utile et copier coller prêt comme un exemple de flux rss.

À partir de mon 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);
        }
    }
}

Et le Code du Contrôleur....

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

}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X