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