Flux RSS dans ASP.NET MVC

Comment recommanderiez-vous la gestion des stream 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?

Voici ce que je recommande:

  1. Créez une classe appelée RssResult qui hérite de la classe de base abstraite ActionResult.
  2. Remplacez la méthode ExecuteResult.
  3. ExecuteResult a le ControllerContext qui lui est transmis par l’appelant et avec cela vous pouvez obtenir le type de données et de contenu.
  4. Une fois que vous avez changé le type de contenu en rss, vous souhaiterez sérialiser les données sur 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 comme RssResult. Saisissez les données de votre modèle en fonction de ce que vous souhaitez retourner.

  6. Ensuite, toute demande à cette action recevra les données de votre choix.

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

Le framework .NET expose les classes qui gèrent la syndation: SyndicationFeed etc. Donc, 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 occuper?

Fondamentalement, vous avez juste besoin de l’actionResult personnalisée suivante 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 les éléments suivants:

 return new RssActionResult() { Feed = myFeedInstance }; 

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

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" %>   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) %>  <% } %>   

Pour plus d’informations, consultez (fiche 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 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 append 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. 😉

J’ai eu ceci d’Eran Kampf et une vidéo de Scott Hanselman (j’ai oublié le lien) donc ce n’est que légèrement différent de quelques autres articles ici, mais heureusement utile et copie le copier prêt comme exemple de stream de 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 ssortingng _title; private readonly ssortingng _description; private readonly List _items; public RssFeed(ssortingng contentType, ssortingng title, ssortingng 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); } } } 

Et le code du contrôleur ….

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