RSS Feeds în ASP.NET MVC

Cum ați recomanda tratarea RSS Feeds în ASV.NET MVC? Folosind o bibliotecă terță parte? Folosind chestii RSS în BCL? Efectuați doar o vizualizare RSS care redă XML? Sau ceva complet diferit?

0
fr hi bn
Doar pentru a actualiza această întrebare în 18 luni de la ultima editare - Pare a fi rezonabil să ne întrebăm "să se schimbe lucrurile cu iterațiile la .net și mvc care ar schimba modul în care abordăm problema gestionării hranei pentru animale"? Consensul (printr-un fir diferit de SO) este că "Nu există schimbări fundamentale - aceasta rămâne cel mai bun set de alternative".
adăugat autor justSteve, sursa
sugestie proastă pentru ASV.NET MVC.
adăugat autor tugberk, sursa
Am scris un RssResult pe care să-l puteți vedea dacă doriți. Ar trebui să îndeplinească cerințele dvs. http: //www.wduffy. co.uk/blog/rssresult-aspnet-mvc-rss-action‌ rezultat/
adăugat autor WDuffy, sursa
Folosind RssToolkit trebuie doar să aveți un singur fișier .ashx în proiectul dvs. pentru a genera feed RSS. Apoi, puteți să rescrieți adresa URL la o adresă prietenoasă. Cred că nu există nimic împotriva MVC în această abordare.
adăugat autor Mahdi Taghizadeh, sursa
Iată un post de urmărire care ia ideea RssActionResult un pic mai departe, cu o clasă de rezultate SyndicationAction generalizată, precum și un filtru condițional 304 NotModified. 58bits.com/blog/ & hellip;
adăugat autor Blue Waters, sursa
Recent am scris un articol despre cum să creezi feeduri RSS în asp.net mvc care ar trebui să facă tot ceea ce căutați
adăugat autor Leland Richardson, sursa

5 răspunsuri

Sunt de acord cu Haacked. În prezent, implementez site-ul/blogul meu folosind cadrul MVC și am mers cu abordarea simplă a creării unei noi Vizualizări pentru 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"?>


<title>ricky rosario's blog</title>
<link>http://<%= Request.Url.Host %></link>
Blog RSS feed for rickyrosario.com
<%= ViewData.Model.First().DatePublished.Value.ToUniversalTime().ToString("r") %>
en-us
<% foreach (Post p in ViewData.Model) { %>
    
    <title><%= Html.Encode(p.Title) %></title>
    <link>http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %></link>
    http://<%= Request.Url.Host + Url.Action("ViewPostByName", new RouteValueDictionary(new { name = p.Name })) %>
    <%= p.DatePublished.Value.ToUniversalTime().ToString("r") %>
    <%= Html.Encode(p.Content) %>
    
<% } %>


For more information, check out (shameless plug) http://rickyrosario.com/blog/creating-an-rss-feed-in-asp-net-mvc

0
adăugat
Ce cheltuială? vrei să spui faptul că scrieți mai puțin cod pentru a realiza același lucru într-un mod mai ușor de citit?
adăugat autor Paul, sursa
pentru utilizarea Razor: @model PageModel @ {Response.ContentType = "application/rss + xml"; } <? xml version = "1.0" encoding = "UTF-8"?>
adăugat autor Anthony Johnston, sursa

Iată ce recomand:

  1. Creați o clasă numită RssResult that moșteneste clasa de bază abstractă ActionResult.
  2. Înlocuiți metoda ExecuteResult.
  3. ExecuteResult are controllerContext pe care la primit de către apelant și cu care puteți obține tipul de date și de conținut.
  4. După modificarea tipului de conținut în rss, veți dori să serializați datele în RSS (folosind propriul dvs. cod sau o altă bibliotecă) și scrieți răspunsul.

  5. Creați o acțiune pe un controler pe care doriți să îl returnați și setați tipul de returnare ca RssResult. Prindeți datele din modelul dvs. pe baza a ceea ce doriți să reveniți.

  6. Apoi, orice solicitare la această acțiune va primi rss de orice date pe care o alegeți.

Acesta este probabil cel mai rapid și reutilizabil mod de a reveni rss are un răspuns la o cerere în ASP.NET MVC.

0
adăugat
@Dale: este posibil să scrieți răspunsul atunci când doriți să ieșiți pentru a fi alimentat într-o vizualizare parțială? Mulțumiri.
adăugat autor Christian, sursa
Hanselman are o soluție similară (video: începând cu aproximativ 41 de metri), unde moștenește de la FileResult. Procedând astfel, puteți să apelați constructorul clasei base ("application/rss + xml") și să evitați pașii 3 și 4. El suprascrie ExecuteResult, dar nu este vital. El, de asemenea, face comenzi rapide cu multe coduri de tip homepun și utilizează caracteristicile SyndicateItem , SyndicateFeed și Rss20FeedFormatter .
adăugat autor patridge, sursa
Linia actualizată de videoclipul lui Hanselman din comentariul meu anterior.
adăugat autor patridge, sursa

Cadrul .NET expune clase care se ocupă de sindicalizare: SyndicationFeed etc. Deci, în loc să faci redarea sau să folosiți altă bibliotecă sugerată de RSS, de ce nu lăsați cadrul să se ocupe de el?

Practic, aveți nevoie de următorul ActionResult personalizat și sunteți gata să mergeți:

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

Acum, în acțiunea controlerului puteți reveni simplu la următoarele:

return new RssActionResult() { Feed = myFeedInstance };

There's a full sample on my blog at http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/

0
adăugat

O altă abordare nebună, dar are avantajul ei, este de a folosi o vizualizare normală .aspx pentru a face RSS. În metoda de acțiune, setați tipul de conținut corespunzător. Unul dintre avantajele acestei abordări este că este ușor de înțeles ce este redat și cum se pot adăuga elemente personalizate, cum ar fi geolocația.

Apoi, din nou, celelalte abordări enumerate ar putea fi mai bune, tocmai nu le-am folosit. ;)

0
adăugat
Mai jos este documentația codificării Html de la MSDN:> Datorită detaliilor actuale de implementare, această funcție poate fi utilizată ca o funcție xmlEncode. În prezent, toate entitățile numite utilizate de această funcție sunt și entități numite xml predefinite. Acestea sunt <> "și codificate ca & lt; & gt; & quot; și alte entități sunt codificate zecimal ca. http://msdn.microsoft.com/en-us/library/73z22y6h.aspx
adăugat autor Ricky, sursa
Cum puteți asigura că xml este valabil în acest fel? Ar fi frumos ca redarea vizualizării să fie decuplată de la o cerere de web de intrare, să fie posibile vizualizări xml sau șabloane de poștă electronică, cum ar fi realizarea rubinilor pe șine.
adăugat autor Paco, sursa
@Haacked: Lumea este plină de RSS xml nevalid generate de un sistem templating. Vă rugăm să nu adăugați la mizerie! Ricky, HTML codificare! = Codificare XML.
adăugat autor Brad Wilson, sursa
În loc să utilizați un motor de vizualizare, puteți crea un RssResult care derivă din ActionResult. Facem acest lucru cu JsonResult care serializează obiectul la JSON. În cazul dumneavoastră, veți găsi unele serializer (cred că WCF are unul) care se serializează la RSS.
adăugat autor Haacked, sursa

Am primit acest lucru de la Eran Kampf și de la un scott Hanselman vid (a uitat link-ul), deci este puțin diferit de alte postări de aici, dar, sperăm, este de ajutor și paste de copiere gata ca exemplu de feed RSS.

De pe blogul meu

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 _items;

        public RssFeed(string contentType, string title, string 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);
        }
    }
}

Și codul de control ....

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

}
0
adăugat