Frage

Wie würden Sie den Umgang mit RSS-Feeds in ASP.NET MVC empfehlen?Verwenden Sie eine Bibliothek eines Drittanbieters?Verwenden Sie das RSS-Material in der BCL?Einfach eine RSS-Ansicht erstellen, die das XML rendert?Oder etwas ganz anderes?

War es hilfreich?

Lösung

Folgendes empfehle ich:

  1. Erstellen Sie eine Klasse namens RSSResult, die die abstrakte Basisklasse -AktionResult erbt.
  2. Überschreiben Sie die ExecuteResult-Methode.
  3. ExecuteResult wird vom Aufrufer der ControllerContext übergeben und damit können Sie den Daten- und Inhaltstyp abrufen.
  4. Sobald Sie den Inhaltstyp in RSS ändern, möchten Sie die Daten in RSS serialisieren (unter Verwendung Ihres eigenen Codes oder einer anderen Bibliothek) und in die Antwort schreiben.

  5. Erstellen Sie eine Aktion auf einem Controller, der RSS zurückgeben soll, und legen Sie den Rückgabetyp auf RssResult fest.Erfassen Sie die Daten Ihres Modells basierend auf dem, was Sie zurückgeben möchten.

  6. Dann erhält jede Anfrage zu dieser Aktion eine RSS-Datei mit den von Ihnen ausgewählten Daten.

Dies ist wahrscheinlich die schnellste und wiederverwendbare Möglichkeit, RSS als Antwort auf eine Anfrage in ASP.NET MVC zurückzugeben.

Andere Tipps

Das .NET Framework stellt Klassen bereit, die die Syndierung verarbeiten:SyndicationFeed usw.Anstatt also das Rendering selbst durchzuführen oder eine andere empfohlene RSS-Bibliothek zu verwenden, warum überlassen Sie es nicht dem Framework?

Im Grunde benötigen Sie nur das folgende benutzerdefinierte ActionResult und schon kann es losgehen:

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 auf meinem Blog unter http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/

Ich stimme Haacked zu.Ich implementieren derzeit meine Website/meinen Blog mit dem MVC-Framework 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 (shameless plug) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

Ein weiterer verrückter Ansatz, der jedoch seinen Vorteil hat, besteht darin, eine normale ASPX-Ansicht zum Rendern des RSS zu verwenden.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 können.

Andererseits könnten die anderen aufgeführten Ansätze besser sein, ich habe sie nur nicht verwendet.;)

Ich habe das von Eran Kampf und einem Scott Hanselman-Video (Link vergessen), es unterscheidet sich also nur geringfügig von einigen anderen Beiträgen hier, ist aber hoffentlich hilfreich und kann als Beispiel-RSS-Feed kopiert und eingefügt werden.

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

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

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top