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
Läuft.
Wer das gesamte Beispiel sucht wird natürlich auf GitHub fündig.