Ritorno sull’argomento Feed RSS per segnalare come implementare una pagina custom che generi dei feed RSS versione 2.0 in ambito di siti di publishing; insomma per articoli scritti con il WCM di SharePoint.Per cominciare ho scelto di generare un feed usando come sorgente la lista Pagine/Pages di un sito web il cui GUID mi viene passato in query string. In aggiunta, visto che in una lista Pagine ci possono essere item di tipo diverso ho deciso di farmi passare anche il content type degli item da estrarre. Detto questo per rispettare le specifiche degli RSS 2.0 e per sfruttare SharePoint recupero alcune proprietà memorizzate a livello di site collection, utili per impostare le informazioini che descrivono il canale (channel):

SPSite site = SPContext.Current.Site;
SPWeb root = site.RootWeb;
rss_Copyright = root.AllProperties["vti_rss_Copyright"].ToString();
rss_ManagingEditor = root.AllProperties["vti_rss_ManagingEditor"].ToString();
// Time to Live in minuti
rss_TimeToLive = root.AllProperties["vti_rss_TimeToLive"].ToString();
rss_WebMaster = root.AllProperties["vti_rss_WebMaster"].ToString();

Ora posso cominciare a scrivere il codice per generare il canale:

PublishingWeb pWeb = PublishingWeb.GetPublishingWeb(web);
SPList pages = web.Lists[PublishingWeb.GetPagesListName(web)];

PublishingPage page = null;

// delcare and instantiate XMLTextWriter object
MemoryStream stream = new MemoryStream();
XmlTextWriter xtw = new XmlTextWriter(stream, Encoding.UTF8);

// write out the XML declaration and version 1.0 info
xtw.WriteStartDocument();

// write out the rss xml element “rss” (required)
xtw.WriteStartElement(”rss”);
xtw.WriteAttributeString(”version”, “2.0″);

// write out “channel” element (required)
xtw.WriteStartElement(”channel”);

// write out title, link, and description based on the feed being requested,
// all three elements are required
xtw.WriteElementString(”title”, “RSS Feed”);
xtw.WriteElementString(”link”, web.Url);
xtw.WriteElementString(”description”, web.Description);
// attributi opzionali
xtw.WriteElementString(”generator”, generator);
xtw.WriteElementString(”copyright”, rss_Copyright);
xtw.WriteElementString(”managingEditor”, rss_ManagingEditor);
xtw.WriteElementString(”webMaster”, rss_WebMaster);
xtw.WriteElementString(”ttl”, rss_TimeToLive);
xtw.WriteElementString(”language”, pWeb.Label.Language);
xtw.WriteElementString(”docs”, docs);
xtw.WriteElementString(”pubDate”, pages.Created.ToString(”R”,
CultureInfo.CreateSpecificCulture(”en-US”)));
xtw.WriteElementString(”lastBuildDate”, pages.LastItemModifiedDate.ToString(”R”,
CultureInfo.CreateSpecificCulture(”en-US”)));

L’ultimo passo è generare un elemento ITEM per ogni item della lista.

// Recupero ITEM tramite query CAML
SPListItemCollection items = pages.Items;

foreach (SPListItem item in items)
{
if (PublishingPage.IsPublishingPage(item) && ValidItem(item,contentTypes))
{
page = PublishingPage.GetPublishingPage(item);

if (page.LastModifiedDate <= DateTime.Now.AddDays(-MaxDays))
{
continue;
}

xtw.WriteStartElement(”item”);
xtw.WriteElementString(”title”, page.Title);
xtw.WriteElementString(”link”, page.Uri.ToString());
xtw.WriteStartElement(”description”);
xtw.WriteCData(item.Properties["PublishingPageContent"].ToString());
xtw.WriteEndElement();
xtw.WriteElementString(”pubDate”, page.CreatedDate.ToString(”R”,
CultureInfo.CreateSpecificCulture(”en-US”)));
xtw.WriteStartElement(”guid”, page.Title);
xtw.WriteAttributeString(”isPermaLink”, “true”);
xtw.WriteString(page.Uri.ToString());
xtw.WriteEndElement();
xtw.WriteEndElement();
}
}

// Close all tags
xtw.WriteEndElement();
xtw.WriteEndElement();
xtw.WriteEndDocument();

xtw.Flush();

string resultXml = null;
using (stream)
{
stream.Position = 0;
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
{
resultXml = reader.ReadToEnd();
}
}

xtw.Close();

return resultXml;

La funzione ValidItem() si occupa di verificare che l’item sia del tipo contenuto voluto. Seguendo questo codice e con qualche linea in più, per esempio per gestire un minimo di cache, è possibile creare il proprio generatore di Feed RSS.