Uno de los webparts más interesantes que nos trae Sharepoint 2007, es sin duda el visor de elementos RSS, el cual nos permite sindicarnos a feeds RSS remotos, e incluso editar la visualización de estos mediante una plantilla XSLT.
Todo es muy bonito y maravilloso, tanto, que incluso aunque tu organización esté tras un proxy, te puede interesar salir del mismo, para poder obtener las sindicaciones.
Digo esto, pq uno de los problemas que encontramos con este webpart que trae Sharepoint por defecto, es la imposibilidad de conectarse a direcciones RSS si estas tras un proxy. Obteniendo un error de conexión del estilo: Error inesperado al procesar la solicitud. Compruebe los registros para ver los detalles y corregir el problema.
Como la situación es un poco peliaguda, pero ya me había pegado con el proxy en alguna otra ocasión, sabía que no debería ser especialmente complicado encontrar una solución idonea, así que me dispuse a hacer mi propio webpart lector de RSS desde 0, el cual, hará que mis peticiones tengan implicitas las credenciales pertinentes para que el proxy sepa quien soy, y permita mi conexión.
Al tema
1º Propiedades
Una vez que tenemos creado un nuevo webPart desde nuestro visualStudio, lo primero será crear las distintas propiedades que necesitaremos para jugar con el proxy, así como con las fuestes RSS que nos traeremos.
namespace rssWebpartProxy
{
[Guid(«25bbe10c-1853-45f1-81e3-7dc2c095148c»)]
public class rssWebpartProxy : System.Web.UI.WebControls.WebParts.WebPart
{
private string pvtUriProxy = «»;
private string pvtUserProxy = «»;
private string pvtPwdProxy = «»;
private string pvtUriRSS = «»;
public rssWebpartProxy()
{
this.ExportMode = WebPartExportMode.All;
}
[WebBrowsable(true), Personalizable(true), WebPartStorage(Storage.Personal),FriendlyName(«Proxy URI»), WebDescription(«Dirección remota del proxy»)]
public string uriProxy
{
get
{
return pvtUriProxy;
}
set
{
pvtUriProxy = value;
}
}
[WebBrowsable(true), Personalizable(true), WebPartStorage(Storage.Personal), FriendlyName(«User Proxy»), WebDescription(«Usuario autenticado en el proxy»)]
public string userProxy
{
get
{
return pvtUserProxy;
}
set
{
pvtUserProxy = value;
}
}
[WebBrowsable(true), Personalizable(true), WebPartStorage(Storage.Personal), FriendlyName(«Password Proxy»), WebDescription(«Password del Usuario autenticado en el proxy»)]
public string pwdProxy
{
get
{
return pvtPwdProxy;
}
set
{
pvtPwdProxy = value;
}
}
[WebBrowsable(true), Personalizable(true), WebPartStorage(Storage.Personal), FriendlyName(«URI RSS»), WebDescription(«Dirección remota del feed RSS»)]
public string uriRSS
{
get
{
return pvtUriRSS;
}
set
{
pvtUriRSS = value;
}
}
En concreto, tendremos las siguientes propiedades:
– uriProxy: En la que almacenaremos el URI de nuestro proxy
– userProxy: En la que introduciremos el usuario que se validará en el proxy
– pwdProxy: Password de conexión, del usuario que se autentificará (¿Cómo se dice autenticar o autentificar?, es una cuestión que me trae de cabeza xd)
– uriRSS: En la que tendremos la dirección remota RSS a la que nos conectaremos
2º Renderizado
Bien, ya tenemos nuestras propiedades, las cuales daran el siguiente aspecto a la configuración de nuestro webPart:
Acontinuación, solo nos faltaría el Render de los contenidos, donde meteremos toda la chicha:
protected override void Render(HtmlTextWriter writer)
{
try
{
System.Net.HttpWebRequest req = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(pvtUriRSS);
req.Proxy = new System.Net.WebProxy(pvtUriProxy);
req.Proxy.Credentials = new System.Net.NetworkCredential(pvtUserProxy, pvtPwdProxy);
System.Net.WebResponse resp = req.GetResponse();
System.IO.StreamReader textReader = new System.IO.StreamReader(resp.GetResponseStream(), System.Text.Encoding.GetEncoding(«Windows-1252»));
System.Xml.XmlTextReader xmlReader = new System.Xml.XmlTextReader(textReader);
System.Data.DataSet ds = new System.Data.DataSet();
ds.ReadXml(xmlReader);
int i = ds.Tables[«item»].Rows.Count – 1;
System.Data.DataRow dr;
String noticias = «»;
while (i >= 0)
{
dr = ds.Tables[«item»].Rows[ i ];
noticias += » <a href=» + dr[1] + » target=’_blank’>» + dr[0] + «</a> – «;
i = i – 1;
}
writer.Write(«<marquee scrollamount=4>» + noticias + «</marquee>»);
}
catch (Exception e)
{
writer.Write(«Conflicto en el Webpart de RSS Proxy:» + e.Message);
}
}
}
}
Primero, haremos una petición httpWebRequest a la dirección Remota a la que queremos acceder, la cual está almacenada en la variable privada pvtUriRSS, que tiene, como podríais observar en la definición de las propiedades, el contenido de la propiedad uriRSS.
A continuación, a dicha petición httpWebRequest le especificaremos los parametros oportunos para las credenciales de su propiedad Proxy. Con esto, lo que haremos, es que nuestra petición vaya autenticada, de tal forma que el Proxy sabrá quien la esta realizando, y por tanto, saber si debe o no permitir el acceso.
El paso siguiente, sería hacer un objeto httpWebResponse a través del HttpWebRequest.getResponse() (el cual a mi me gusta traducir como la exigencia de respuesta de una petición).
En el objeto resultante (resp), ya tendremos nuestra información, y el último paso será simplemente visualizarlo de la manera que creamos más conveniente.
En el ejemplo, como podeis ver, yo utilizo un StreamReader para leer el chorro de datos, le especifico la codificación de «letra» que utilizo en el servidor donde voy a instalar el webpart, se lo paso a un xmlRealder (ya que la sindicación RSS, como sabemos viene en formato XML), lo cargo en un dataSet y a rular…
En el paso final lo unico que hago a la hora de renderizar la información, es mostrar en modo de <marquesina>, arriesgándome con el uso de esta a no pasar algún test de accesibilidad, pero al ser un simple ejemplo, creo que queda chulo y facil de hacer, otro gallo cantará cuando queramos usarlo en algún entorno de producción exigente, que nos obligue a cambiar la forma de visualizar el resultado rss, al cual podremos aplicar XSLT, (como por ejemplo vemos en un anterior articulo que realicé sobre como crear tu lector rss en 5 minutos)
3º Instalación
Gracias a la simplicidad de instalación de elementos web que nos aporta MOSS, podremos instalar la dll generada de forma sencilla.
Para ello recordar:
– Deberá ir firmada.
– Tendremos que registrarla como elemento seguro en el web.config de nuestro portal:
– Y por último agregarla desde la sección de Elementos Web dentro de la configuración de nuestro portal.
Dejo disponible un zip con el WebPart, para el que quiera usarlo directamente, sin complicarse mucho la vida 🙂
Un saludo
Hola que nada gracias, tengo una duda, cual seria el Proxy URI, la direcion de mi proxi, por ejemplo http:\la ip:el puerto, o es un archivo con otros datos?
Muchas gracias
Patricio
Hola Patricio.
Seria exactamente como expones en el ejemplo, http://ipDelProxy:puerto
Aunque si este escucha por el :80 no hace falta que lo pongas.
Un saludo.
muchas gracias por compartir el articulo, no me queda claro como modificar el web.config podrias ayudarme, la duda concretamente es con el PublicKeyToken y con el Namespace de donde saco los valores
El namespace es el que le hayas puesto a tu aplicación , en cuanto a la clave publica, puedes verla facilmente viendo las propiedades de la dll
Gracias por el aporte, podrias explicarme mas detalladamente como instalar esta webpart…
Mi correo es rferre@cotas.com , gracias