Domanda

Come consiglieresti di gestire i feed RSS in ASP.NET MVC?Utilizzi una libreria di terze parti?Utilizzando il materiale RSS nella BCL?Stai semplicemente creando una visualizzazione RSS che restituisca l'XML?O qualcosa di completamente diverso?

È stato utile?

Soluzione

Ecco cosa consiglio:

  1. Crea una classe chiamata RSSResult che eredita la classe di base astratta ActionResult.
  2. Sostituisci il metodo ExecuteResult.
  3. ExecuteResult riceve il ControllerContext dal chiamante e con questo è possibile ottenere i dati e il tipo di contenuto.
  4. Una volta modificato il tipo di contenuto in RSS, ti consigliamo di serializzare i dati in RSS (utilizzando il tuo codice o un'altra libreria) e scrivere nella risposta.

  5. Crea un'azione su un controller a cui desideri restituire RSS e imposta il tipo restituito come RssResult.Prendi i dati dal tuo modello in base a ciò che desideri restituire.

  6. Quindi qualsiasi richiesta a questa azione riceverà RSS di qualunque dato tu scelga.

Questo è probabilmente il modo più rapido e riutilizzabile per restituire RSS in risposta a una richiesta in ASP.NET MVC.

Altri suggerimenti

Il framework .NET espone classi che gestiscono la syndation:SyndicationFeed ecc.Quindi, invece di eseguire tu stesso il rendering o utilizzare qualche altra libreria RSS suggerita, perché non lasciare che il framework se ne occupi?

Fondamentalmente hai solo bisogno del seguente ActionResult personalizzato e sei pronto per partire:

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

Ora nell'azione del controller puoi semplicemente restituire quanto segue:

return new RssActionResult() { Feed = myFeedInstance };

C'è un campione completo sul mio blog all'indirizzo http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/

Sono d'accordo con Haacked.Attualmente sto implementando il mio sito/blog utilizzando il framework MVC e ho seguito il semplice approccio creando una nuova vista per 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>

Per ulteriori informazioni, controlla (spina spudorata) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

Un altro approccio folle, ma che ha il suo vantaggio, consiste nell'utilizzare una normale visualizzazione .aspx per eseguire il rendering dell'RSS.Nel tuo metodo di azione, imposta semplicemente il tipo di contenuto appropriato.L'unico vantaggio di questo approccio è che è facile capire cosa viene visualizzato e come aggiungere elementi personalizzati come la geolocalizzazione.

D'altra parte, gli altri approcci elencati potrebbero essere migliori, semplicemente non li ho usati.;)

L'ho preso da Eran Kampf e da un video di Scott Hanselman (ho dimenticato il collegamento), quindi è solo leggermente diverso da alcuni altri post qui, ma spero che sia utile e pronto per il copia e incolla come esempio di feed RSS.

Dal mio 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);
        }
    }
}

E il Codice del Controller....

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

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top