Comment recommanderiez-vous de gérer les flux RSS dans ASP.NET MVC? Vous utilisez une bibliothèque tierce? Vous utilisez le contenu RSS dans la BCL? Vous venez de créer une vue RSS qui rend le XML? Ou quelque chose de complètement différent?
Comment recommanderiez-vous de gérer les flux RSS dans ASP.NET MVC? Vous utilisez une bibliothèque tierce? Vous utilisez le contenu RSS dans la BCL? Vous venez de créer une vue RSS qui rend le XML? Ou quelque chose de complètement différent?
Réponses:
Voici ce que je recommande:
Une fois que vous avez changé le type de contenu en rss, vous voudrez sérialiser les données en RSS (en utilisant votre propre code ou une autre bibliothèque) et écrire dans la réponse.
Créez une action sur un contrôleur que vous souhaitez retourner 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.
Ensuite, toute demande à cette action recevra rss des données que vous choisissez.
C'est probablement le moyen le plus rapide et réutilisable de renvoyer rss a une réponse à une requête dans ASP.NET MVC.
base("application/rss+xml")
et éviter les étapes 3 et 4. Il remplace ExecuteResult, mais ce n'est pas vital. Il raccourcis également beaucoup de code typiquement bure et utilise les caractéristiques 3.5+ SyndicateItem
, SyndicateFeed
et Rss20FeedFormatter
.
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 charger?
Fondamentalement, vous avez juste besoin du ActionResult personnalisé suivant et vous êtes prêt à commencer:
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 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 une approche simple de création d'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 (plug 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é. 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 énumérées pourraient être meilleures, je ne les ai tout simplement pas utilisées. ;)
Je l'ai obtenu 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 messages ici, mais j'espère que cela est utile et que le copier-coller est prêt comme exemple de flux 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);
}
}
}
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()));
}