14 May 2014 HowTo, RSS Robert Muehsig

Ich hatte hier schon öfters geschrieben wie man RSS oder Atom Feeds konsumieren kann – jetzt geht es aber mal um das erstellen bzw. publishen eines eigenen Feeds. Trotz des Alters von den Feed Standards und die vielen Abgesänge von Facebook, Twitter und Google auf RSS/Atom halte ich diese einfach zu konsumierende API für ziemlich praktisch.

Nun gut… ASP.NET MVC Infstrastruktur Code: Ein RSS Result

Die Inspiration des ActionResults kommt von diesem Blog. Die Implementierung ist trivial. Das einzige was man benötigt ist eine Referenz auf System.ServiceModel.

   1: public class RssResult : FileResult
   2: {
   3:     private readonly SyndicationFeed _feed;
   4:  
   5:     /// <summary>
   6:     /// Creates a new instance of RssResult
   7:     /// based on this sample 
   8:     /// http://www.developerzen.com/2009/01/11/aspnet-mvc-rss-feed-action-result/
   9:     /// </summary>
  10:     /// <param name="feed">The feed to return the user.</param>
  11:     public RssResult(SyndicationFeed feed)
  12:         : base("application/rss+xml")
  13:     {
  14:         _feed = feed;
  15:     }
  16:  
  17:     /// <summary>
  18:     /// Creates a new instance of RssResult
  19:     /// </summary>
  20:     /// <param name="title">The title for the feed.</param>
  21:     /// <param name="feedItems">The items of the feed.</param>
  22:     public RssResult(string title, List<SyndicationItem> feedItems)
  23:         : base("application/rss+xml")
  24:     {
  25:         _feed = new SyndicationFeed(title, title, HttpContext.Current.Request.Url) { Items = feedItems };
  26:     }
  27:  
  28:     protected override void WriteFile(HttpResponseBase response)
  29:     {
  30:         using (XmlWriter writer = XmlWriter.Create(response.OutputStream))
  31:         {
  32:             _feed.GetRss20Formatter().WriteTo(writer);
  33:         }
  34:     }
  35: } 

Die Action

Durch das ActionResult können wir jetzt in jedem Controller einfach ein Feed zurückgeben.

   1: public virtual ActionResult Feed(string id)
   2:     {
   3:         var items = new List<SyndicationItem>();
   4:  
   5:         for (int i = 0; i < 10; i++)
   6:         {
   7:             string feedTitle = "Test Title " + i;
   8:  
   9:             var helper = new UrlHelper(this.Request.RequestContext);
  10:             var url = helper.Action("Index", "Home", new { }, Request.IsSecureConnection ? "https" : "http");
  11:  
  12:             var feedPackageItem = new SyndicationItem(feedTitle, "Test Description " + i, new Uri(url));
  13:             feedPackageItem.PublishDate = DateTime.Now;
  14:             items.Add(feedPackageItem);
  15:         }
  16:  
  17:         return new RssResult("Demo Feed", items);
  18:     }   

Die einzige Stolperfalle hier ist vermutlich die URL. Standardmäßig erzeugt der UrlHelper immer nur relative Links. Durch die Angabe aller Parameter wird aber daraus eine vollständige URL.

Ergebnis

image

Läuft.

Wer das gesamte Beispiel sucht wird natürlich auf GitHub fündig.


Written by Robert Muehsig

Software Developer - from Dresden, Germany, now living & working in Switzerland. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de

If you like the content and want to support me you could buy me a beer or a coffee via Litecoin or Bitcoin - thanks for reading!