ASP.NET MVC 2 w standardzie nie posiada niestety żadnego ActionResult, które zwracałoby nam treść w formacie RSS. Nie mniej jednak nic nie stoi na przeszkodzie, aby dopisać klasę dziedziczącą z ActionResult, która będzie generować taki kanał.
W tym wpisie prezentuję jak to zrobić.
Pierwszym krokiem do implementacji kanału RSS jest utworzenie klasy pomocniczej RssResult, która prezentuje się następująco:
using System.Web.Mvc; using System.ServiceModel.Syndication; using System.Xml; namespace luktom.Samples { public class RssResult : ActionResult { public SyndicationFeed Feed { get; set; } public override void ExecuteResult(ControllerContext context) { context.HttpContext.Response.ContentType = "application/rss+xml"; Rss20FeedFormatter rss = new Rss20FeedFormatter(Feed); using (XmlWriter writer = XmlWriter.Create(context.HttpContext.Response.Output)) { rss.WriteTo(writer); } } } }
W przypadku, gdy namespace System.ServiceModel.Syndication i należąca do niej klasa Rss20FeedFormatter nie zostaną odnalezione, należy dodać do projektu referencję do System.ServiceModel.Web – w dokumentacji na MSDN jest błąd i przestrzeń Syndication fizycznie mieści się właśnie w System.ServiceModel.Web.dll.
Drugim krokiem jest dodanie odpowiedniego kontrolera i stosownej akcji:
public ActionResult RssFeed() { SyndicationFeed feed = new SyndicationFeed("luktom.net rss", "Testowy kanał RSS", new Uri("http://rss.luktom.net/test")); List feedItems = new List<SyndicationItem>(); // tutaj dodajemy elementy do kanału feedItems.Add(new SyndicationItem("Element 1", "Opis elementu 1", new Uri("http://url.do/elementu1"), "unikatowy-identyfikator-1", DateTime.Now)); // data aktualizacji elementu feed.Items = feedItems; return new RssResult() { Feed = feed }; }
Na zakończenie sugeruję w Global.asax dodać nową trasę (route) do kanału RSS, aby w razie zmiany w kontrolerze nie mieć problemu z koniecznością aktualizacji adresu kanału RSS u klientów.
Dodaj komentarz