Wie würden Sie den Umgang mit RSS-Feeds in ASP.NET MVC empfehlen? Verwenden Sie eine Drittanbieter-Bibliothek? Verwenden Sie das RSS-Zeug in der BCL? Nur eine RSS-Ansicht erstellen, die das XML rendert? Oder etwas ganz anderes?
Wie würden Sie den Umgang mit RSS-Feeds in ASP.NET MVC empfehlen? Verwenden Sie eine Drittanbieter-Bibliothek? Verwenden Sie das RSS-Zeug in der BCL? Nur eine RSS-Ansicht erstellen, die das XML rendert? Oder etwas ganz anderes?
Antworten:
Folgendes empfehle ich:
Sobald Sie den Inhaltstyp in rss geändert haben, möchten Sie die Daten in RSS serialisieren (unter Verwendung Ihres eigenen Codes oder einer anderen Bibliothek) und in die Antwort schreiben.
Erstellen Sie eine Aktion auf einem Controller, für den Sie RSS zurückgeben möchten, und legen Sie den Rückgabetyp als RssResult fest. Holen Sie sich die Daten aus Ihrem Modell basierend auf dem, was Sie zurückgeben möchten.
Dann erhält jede Anfrage an diese Aktion RSS mit den von Ihnen ausgewählten Daten.
Dies ist wahrscheinlich die schnellste und wiederverwendbare Methode zur Rückgabe von RSS-Antworten auf eine Anforderung in ASP.NET MVC.
base("application/rss+xml")
ausführen und die Schritte 3 und 4 vermeiden. Er überschreibt zwar ExecuteResult, dies ist jedoch nicht unbedingt erforderlich. Er Kürzel auch viele typisch-homespun Code und verwendet die 3.5+ Eigenschaften SyndicateItem
, SyndicateFeed
und Rss20FeedFormatter
.
Das .NET Framework stellt Klassen bereit, die sich mit der Syndierung befassen: SyndicationFeed usw. Anstatt das Rendering selbst durchzuführen oder eine andere vorgeschlagene RSS-Bibliothek zu verwenden, lassen Sie das Framework sich darum kümmern.
Grundsätzlich benötigen Sie nur das folgende benutzerdefinierte ActionResult und können loslegen:
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);
}
}
}
Jetzt können Sie in Ihrer Controller-Aktion einfach Folgendes zurückgeben:
return new RssActionResult() { Feed = myFeedInstance };
Ein vollständiges Beispiel finden Sie in meinem Blog unter http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/.
Ich stimme Haacked zu. Ich implementiere derzeit meine Website / mein Blog mithilfe des MVC-Frameworks und habe den einfachen Ansatz gewählt, eine neue Ansicht für RSS zu erstellen:
<%@ 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>
Weitere Informationen finden Sie unter (schamloser Stecker) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc
Ein anderer verrückter Ansatz, der jedoch seinen Vorteil hat, ist die Verwendung einer normalen ASPX-Ansicht zum Rendern des RSS. Legen Sie in Ihrer Aktionsmethode einfach den entsprechenden Inhaltstyp fest. Der einzige Vorteil dieses Ansatzes besteht darin, dass leicht zu verstehen ist, was gerendert wird und wie benutzerdefinierte Elemente wie die Geolokalisierung hinzugefügt werden.
Andererseits könnten die anderen aufgeführten Ansätze besser sein, ich habe sie einfach nicht verwendet. ;)
Ich habe dies von Eran Kampf und einem Scott Hanselman-Video erhalten (habe den Link vergessen), daher unterscheidet es sich nur geringfügig von einigen anderen Posts hier, ist aber hoffentlich hilfreich und kann als Beispiel für einen RSS-Feed kopiert und eingefügt werden.
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);
}
}
}
Und der Controller Code ....
[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()));
}