Question

Comment recommanderiez-vous de gérer les flux RSS dans ASP.NET MVC ?Vous utilisez une bibliothèque tierce ?Vous utilisez les éléments RSS dans la BCL ?Vous créez simplement une vue RSS qui restitue le XML ?Ou quelque chose de complètement différent ?

Était-ce utile?

La solution

Voici ce que je recommande :

  1. Créez une classe appelée RSSResult qui hérite de la classe de base abstraite RETACTRESULT.
  2. Remplacez la méthode ExecuteResult.
  3. ExecuteResult reçoit le ControllerContext transmis par l'appelant et avec cela, vous pouvez obtenir les données et le type de contenu.
  4. Une fois que vous avez modifié le type de contenu en rss, vous souhaiterez sérialiser les données en RSS (en utilisant votre propre code ou une autre bibliothèque) et écrire dans la réponse.

  5. Créez une action sur un contrôleur que vous souhaitez renvoyer rss et définissez le type de retour sur RssResult.Récupérez les données de votre modèle en fonction de ce que vous souhaitez renvoyer.

  6. Ensuite, toute demande concernant cette action recevra un flux RSS des données que vous choisissez.

C'est probablement le moyen le plus rapide et réutilisable de renvoyer une réponse à une requête dans ASP.NET MVC.

Autres conseils

Le framework .NET expose les classes qui gèrent la syndication :SyndicationFlux, etc.Alors, au lieu de faire le rendu vous-même ou d'utiliser une autre bibliothèque RSS suggérée, pourquoi ne pas laisser le framework s'en charger ?

Fondamentalement, vous avez juste besoin du ActionResult personnalisé suivant et vous êtes prêt à partir :

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 l'action de votre contrôleur, vous pouvez simplement renvoyer ce qui suit :

return new RssActionResult() { Feed = myFeedInstance };

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

Je suis d'accord avec Haacked.J'implémente actuellement mon site/blog en utilisant le framework MVC et j'ai opté pour l'approche simple consistant à créer une nouvelle vue 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 (prise sans vergogne) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

Une autre approche folle, mais qui a son avantage, consiste à utiliser une vue .aspx normale pour restituer le RSS.Dans votre méthode d'action, définissez simplement le type de contenu approprié.Le seul 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 répertoriées pourraient être meilleures, mais je ne les ai tout simplement pas utilisées.;)

J'ai reçu ceci d'Eran Kampf et d'une vidéo de Scott Hanselman (j'ai oublié le lien), donc ce n'est que légèrement différent de certains autres articles ici, mais j'espère qu'il sera utile et prêt à copier-coller comme exemple de flux RSS.

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

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top