Estrutura XML RSS 2.0
<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>RSS Title</title>
<description>This is an example of an RSS feed</description>
<link>http://www.someexamplerssdomain.com/main.html</link>
<lastBuildDate>Mon, 06 Sep 2010 00:01:00 +0000 </lastBuildDate>
<pubDate>Mon, 06 Sep 2009 16:45:00 +0000 </pubDate>
<item>
<title>Example entry</title>
<description>Here is some text containing an interesting description.</description>
<link>http://www.wikipedia.org/</link>
<guid>unique string per item</guid>
<pubDate>Mon, 06 Sep 2009 16:45:00 +0000 </pubDate>
</item>
</channel>
</rss>
Considerações Iniciais
A primeira consideração que temos de ter em atenção é que para efectuarmos o nosso response não podemos utilizar nenhum Layout de Página, temos de utilizar uma página que "saia" do SharePoint como acontece em todos os procedimentos deste tipo.
Neste exemplo vamos utiliza uma página ASPX e vamos adicionar um Controlo de Utilizador à mesma, visto a grande maioria das Aplicações SharePoint assentar em camadas, uma delas certamente a de estrutura do nosso site onde colocamos todas as nossas páginas ASPX, Controlos de Utilizador, Layouts e finalmente as nossas Features por for-ma a propagarmos a nossa estrutura na altura da Instalação do Portal activando-as.
Vamos separar o nosso CAML Query do método principal por forma a termos uma maior percepção do código.
Método CAML Query
Vamos criar um método Protected invocando o Object Model através do SPQuery.
protected SPQuery ONossoCamlQuery()
{
SPQuery qry = new SPQuery();
qry.ViewAttributes += "Scope=\"Recursive\"";
string camlQry = String.Empty;
qry.Query = camlQry;
O próximo passo, a nossa String para a Query. Neste passo temos de modificar ‘OSeuCampoData’ para o nome do cam-po que queremos filtrar, em que sugiro a utilização do CAML QUERY BUILDER
Deverá funcionar em ambos MOSS e SharePoint 2010, pelo me-nos para elaborarmos o nosso filtro.
try
{
camlQry = "<OrderBy><FieldRef Name='OSeuCampoData' Ascending='False' /></OrderBy>";
qry.Query = camlQry;
}
catch (Exception)
{
throw;
}
Vamos deixar "Ascending=’False’" para ser apresentado por ordem decrescente.
Vamos limitar o nosso resultado a 10 páginas, caso contrário poderá ser lento e não funcionar correctamente visto que limitamos o nosso tempo limite de cache por forma a ser eficaz em todos os RSS Readers.
qry.RowLimit = 10;
O método completo:
protected SPQuery ONossoCamlQuery()
{
SPQuery qry = new SPQuery();
qry.ViewAttributes += "Scope=\"Recursive\"";
string camlQry = String.Empty;
qry.Query = camlQry;
try
{
camlQry = "<OrderBy><FieldRef Name='OSeuCampoData' Ascending='False' /></OrderBy>";
qry.Query = camlQry;
}
catch (Exception)
{
throw;
}
qry.RowLimit = 10;
return qry;
}
Limite de tempo de Cache
Primeiro vamos definir no ASPX do nosso controlo a duração do Cache de Saída, que será a duração permitida do Output-Cache por forma a não ficarmos com pedidos longos. Mais informação em ASP.NET Caching
<%@ OutputCache Duration="120" VaryByParam="*" %>
Método para construção do RSS
O método consiste em criarmos uma Response e dinamica-mente renderizar o XML Standard enumerando uma Lista de Páginas de SharePoint filtrado pelo nosso CAML Query
readonly string NossoUrlNivelRoot = String.Format("{0}//{1}:{2}", SPContext.Current.Site.Protocol, SPContext.Current.Site.HostName, SPContext.Current.Site.Port);
Vamos buscar o URL de Root dinamicamente:
Dentro do URL de Root vamos buscar a área onde está a lista de páginas, exemplo "Noticias"
string URL = NossoUrlNivelRoot + "/NossaAreaDentroDaRoot";
Limpamos a nossa Response e iniciamos uma nova baseada em XML.
Response.Clear();
Response.ContentType = "text/xml";
Definir o encoding para UTF8 e começar a escrever o XML na página.
XmlTextWriter TextWriter = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
TextWriter.WriteStartDocument();
TAGS mandatórias RSS 2.0
TextWriter.WriteStartElement("rss");
TextWriter.WriteAttributeString("version", "2.0");
O Channel TAG que vai conter a informação do FEED crian-do o nosso nó XML "channel", dentro deste iremos criar a seguir outro nó chamado "item" com a informação das nossas páginas SharePoint.
TextWriter.WriteStartElement("channel");
TextWriter.WriteElementString("title", "JOAO TITO LIVIO");
TextWriter.WriteElementString("link", " http://msmvps.com/blogs/officept/default.aspx");
TextWriter.WriteElementString("description", "Espero que gostes deste RSS");
TextWriter.WriteElementString("copyright", "Copyright 2011 Joao Tito Livio. All rights reserved.");
Abrir o nosso WEB usando o Object Model vamos utilizar Using por forma a não termos problemas de dispose dos objectos do SharePoint.
Abrir a nossa lista através do SPList e seguidamente enumerar as páginas através de uma SPListItemCollection. Nesta fase vamos chamar o nosso método em que definimos o nosso CAML Query. Vemos também que a nossa lista se chama "Pages", mude para "Paginas" ou o nome que deu à mesma.
SPList ListaDePaginas = web.Lists["Pages"];
SPListItemCollection ColecaoListaDePaginas = ListaDePaginas.GetItems(ONossoCamlQuery());
Agora dentro da nossa colecção de páginas vamos buscar a informação de cada uma através de um SPItem a que chamo elemento verificando sempre se dentro de cada elemento ele é nulo e começando a escrever um nó de XML chamado "item" citado anteriormente. Temos de ter em atenção a mu-dança dos nomes dos campos a que se refere cada elemen-to pelos definidos por si.
SPItem elemento = ColecaoListaDePaginas[z];
TextWriter.WriteStartElement("item");
if (elemento["CampoTituloPaginaSharepoint"] != null)
TextWriter.WriteElementString("title", elemento["CampoTituloPaginaSharepoint"].ToString());
if (elemento["CampoDescricaoPaginaSharepoint"] != null)
TextWriter.WriteElementString("description", elemento["CampoDescricaoPaginaSharepoint"].ToString());
if (elemento["CampoLinkPaginaSharepoint"] != null)
Neste elemento string "link" estamos a construir dinamicamente o Link para a lista de páginas que abrimos anterior-mente, novamente vemos que a nossa lista se chama "Pages", mude para "Paginas" ou o nome que deu à mesma
TextWriter.WriteElementString("link", String.Format("{0}/Pages/{1}", URL, elemento["CampoLinkPaginaSharepoint"]));
if (elemento["CampoDataPublicacaoPaginaSharepoint"] != null)
TextWriter.WriteElementString("pubDate", elemento["CampoDataPublicacaoPaginaSharepoint"].ToString());
TextWriter.WriteEndElement();
Vamos fechar todos os elementos e acabar a nossa Response.
TextWriter.WriteEndElement();
TextWriter.WriteEndElement();
TextWriter.WriteEndDocument();
TextWriter.Flush();
TextWriter.Close();
Response.End();
Método completo
protected void GetYourRss()
{
readonly string NossoUrlNivelRoot = String.Format("{0}//{1}:{2}", SPContext.Current.Site.Protocol, SPContext.Current.Site.HostName, SPContext.Current.Site.Port);
try
{
string URL = NossoUrlNivelRoot + "/NossaAreaDentroDaRoot";
Response.Clear();
Response.ContentType = "text/xml";
XmlTextWriter TextWriter = new XmlTextWriter(Response.OutputStream, Encoding.UTF8);
TextWriter.WriteStartDocument();
TextWriter.WriteStartElement("rss");
TextWriter.WriteAttributeString("version", "2.0");
TextWriter.WriteStartElement("channel");
TextWriter.WriteElementString("title", "JOAO TITO LIVIO");
TextWriter.WriteElementString("link", " http://msmvps.com/blogs/officept/default.aspx");
TextWriter.WriteElementString("description", "Enjoy your RSS");
TextWriter.WriteElementString("copyright", "Copyright 2011 Joao Tito Livio. All rights reserved.");
using (SPSite site = new SPSite(URL))
{
using (SPWeb web = site.OpenWeb())
{
SPList ListaDePaginas = web.Lists["Pages"];
SPListItemCollection ColecaoListaDePaginas = ListaDePaginas.GetItems(ONossoCamlQuery());
for (int z = 0; z < ColecaoListaDePaginas.Count; z++)
{
SPItem elemento = ColecaoListaDePaginas[z];
TextWriter.WriteStartElement("item");
if (elemento["CampoTituloPaginaSharepoint"] != null)
TextWriter.WriteElementString("title", elemento["CampoTituloPaginaSharepoint"].ToString());
if (elemento["CampoDescricaoPaginaSharepoint"] != null)
TextWriter.WriteElementString("description", elemento["CampoDescricaoPaginaSharepoint"].ToString());
if (elemento["CampoLinkPaginaSharepoint"] != null)
TextWriter.WriteElementString("link", String.Format("{0}/Pages/{1}", URL, elemento["CampoLinkPaginaSharepoint"]));
if (elemento["CampoDataPublicacaoPaginaSharepoint"] != null)
TextWriter.WriteElementString("pubDate", elemento["CampoDataPublicacaoPaginaSharepoint"].ToString());
TextWriter.WriteEndElement();
}
}
}
TextWriter.WriteEndElement();
TextWriter.WriteEndElement();
TextWriter.WriteEndDocument();
TextWriter.Flush();
TextWriter.Close();
Response.End();
}
catch (Exception ex)
{
throw new Exception(ex.ToString());
}
}
Considerações Finais