Tutorial Creación Lector RSS en .Net

IS4kO

Creación de un Lector de RSS en .Net

1º Introducción RSS y su extensabilidad
2º WebRequest
3º WebResponse
4º Propiedades Proxy del objeto WebRequest
5º Código
6º Bibliografía

1º Introducción a RSS y su extensabilidad

RSS es parte de la familia de los formatos XML desarrollado específicamente para todo tipo de sitios que se actualicen con frecuencia y por medio del cual se puede compartir la información y usarla en otros sitios web o programas. A esto se le conoce como sindicación.

El acrónimo se usa para los siguientes estándares:

• Rich Site Summary (RSS 0.91)
• RDF Site Summary (RSS 0.9 and 1.0)
• Really Simple Syndication (RSS 2.0)

Los programas que leen y presentan fuentes RSS de diferentes procedencias se denominan agregadores.
Gracias a los agregadores o lectores de feeds (programas o sitios que permiten leer fuentes RSS) se puede obtener resúmenes de todos los sitios que se desee desde el escritorio de tu sistema operativo, programas de correo electrónico o por medio de aplicaciones web que funcionan como agregadores. No es necesario abrir el navegador y visitar decenas de webs.

Pero lo verdaderamente importante es que a partir de este formato se está desarrollando una cadena de valor nueva en el sector de los contenidos que está cambiando las formas de relación con la información tanto de los profesionales y empresas del sector como de los usuarios.

Así pues, atendiendo a esto ahora mismo podrías leer las noticias de MV en tu nevera si esta tuviera conexión a Internet (cosa que empezará a ser habitual en los tiempos que corren), y el lector que crearemos más adelante incorporado.

2º Web Request

Realiza una solicitud a un identificador de recursos uniforme (URI). Esto es una clase abstracta MustInherit en Visual Basic. Esto quiere decir que WebRequest es la clase base del modelo de solicitud/respuesta .NET Framework para tener acceso a datos desde Internet. Una aplicación que utilice el modelo de solicitud/respuesta puede solicitar datos de Internet de una manera que sea válida para los protocolos, donde la aplicación trabaja con instancias de la clase WebRequest mientras que las clases descendientes específicas del protocolo se encargan de los detalles de la solicitud.
Las solicitudes se envían desde una aplicación a un identificador URI concreto, como una página Web de un servidor. El identificador URI determina la clase descendiente adecuada que se debe crear a partir de una lista de descendientes de WebRequest registrados para la aplicación. Los descendientes de WebRequest suelen registrarse para controlar un protocolo específico, como HTTP o FTP, pero se pueden registrar para controlar una solicitud a un servidor específico o una ruta de acceso en éste.

3º WebResponse

La clase WebResponse es la clase base (MustInherit en Visual Basic) a partir de la cual se derivan las clases de respuesta específicas del protocolo. Las aplicaciones pueden participar en transacciones de solicitud y respuesta de un modo que sea válido para protocolos utilizando instancias de la clase WebResponse mientras las clases específicas del protocolo derivadas de WebResponse se encargan de los detalles de la solicitud.

Es importante destacar que las aplicaciones cliente no crean objetos WebResponse directamente, sino mediante una llamada al método GetResponse en una instancia de WebRequest.

4º Propiedades Proxy del objeto WebRequest

Según realizaba la aplicación, me ví con un problema, y es que inexplicablemente no conseguía acceder al archivo XML remoto. Bien, tras darle unas cuantas vueltas me percaté de que estaba bajo un proxy de filtrado de usuarios de dominio. Esto es, que para salir a internet antes pasas por un proxy que comprueba los datos de la conexión saliente, y si la autentificación es válida, permite la salida de la conexión.
Por lo tanto primer requisito, tener acceso a internet. Lo curioso de este sistema es que tu, estando autentificado en tu máquina a la vez q en un posible dominio, cuando te conectas a internet la autentificación que haces al proxy es automática, mientras que para poder acceder desde esta aplicación tendrás que mandarle las credenciales para esa autentificación manualmente.
Y esto como se hace te preguntarás, pues basta con echarle un vistazo a las propiedades del objeto WebRequest que usamos para hacer la petición remota, entre ellas encontramos la propiedad Proxy, que será la que usaremos para decirle a nuestro amado Proxy quienes somos. Para ello escribiremos:

Dim req As WebRequest = WebRequest.Create("dirección del xml")
req.Proxy = New WebProxy("dirección del proxy:8080")
req.Proxy.Credentials = New NetworkCredential("usuario", "password")

Como podemos ver, nos creamos una instancia del objeto WebRequest pasándole la dirección remota en la que se encontrará la ubicación del .XML, y después a la propiedad Proxy de dicha instancia le pasaremos la dirección del Proxy y las Credenciales de red, es decir el usuario y el password que debe tener permiso de salida.

Por supuesto si no estuviéramos bajo ningún Proxy este código no tendríamos pq emplearlo :-P

5º Código

Imports System.Xml
Imports System.Xml.Xsl
Imports System.Net
Imports System.IO

Partial Class _Default
Inherits System.Web.UI.Page

Protected Sub form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles form1.Load

    Dim midataset As New Data.DataSet
    Dim req As WebRequest = WebRequest.Create("dirección RSS remota")

    'En el caso de que tengamos proxy
    '********************************
    'req.Proxy = New WebProxy("dirección del proxy:8080")
    'req.Proxy.Credentials = New NetworkCredential("user", "pass")
    '********************************

    Dim miResponse As WebResponse = req.GetResponse()
    midataset.ReadXml(miResponse.GetResponseStream)
    miResponse.Close()


    Dim memStream As Stream = New MemoryStream()
    Dim xmlDocument As XmlDataDocument = New XmlDataDocument(midataset)

    Dim xslTran As XslCompiledTransform = New XslCompiledTransform
    xslTran.Load(Server.MapPath("PlantillaXML.xsl"))

    Dim writer As XmlTextWriter = New XmlTextWriter(memStream, System.Text.Encoding.UTF8)

    xslTran.Transform(xmlDocument, Nothing, writer)

    memStream.Position = 0

    Dim sr As StreamReader = New StreamReader(memStream)

    Dim line As String
    Do
        line = sr.ReadLine()
        'Visualizamos el resultado en una simple label..
        Label1.Text += " " + line
    Loop Until line Is Nothing
    sr.Close()
    writer.Close()

End Sub

End Class

PlantillaXML.xsl:

<?xml version="1.0" encoding="iso-8859-1"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rss="http://purl.org/rss/1.0/">
<xsl: output method="html"/>
<xsl:template match="channel">
<html>


    <xsl:for-each select="item">

      <table>
        <tr>
          <td>
          </td>
          <td>
            <a href="{link}" target="Blank">
              <xsl:value-of select="title"/>
            </a>
          </td>
        </tr>
      </table>
    </xsl:for-each>

  </body>
</html>

</xsl:template>
</xsl:stylesheet>

6º Bibliografía

Para realizar este manual, he tomado “prestados” aquellos conceptos, nociones e indicaciones de varios lugares:

<http://msdn.microsoft.com/>
<http://support.microsoft.com/>
<http://es.wikipedia.org/wiki/Portada>
<http://www.w3.org/TR/xslt>

By: IS4KO
Contact: is4ko@hotmail.com

A

Felicidades, buena guía. La verdad es que las cosas son muy fáciles cuando podemos usar un WebRequest y un ReadXML. Saber programar hoy en día es saber sacarle jugo a las librerías (o componentes) que otros hicieron en un pasado.

erdanblo

!_! al final lo sacastes, xd, si era cuestión de tiempo.

A

Mmmm... y ya que estamos:
http://www.developer.com/net/vb/article.php/3567141

IS4kO

Me costó el tema del proxy, pq yo metia usuario estilo DOMINIO\usuario y tenía que meterlo como usuario@dominio, supongo que eso dependerá de la configuración del proxy :)

IMPORTANTE, destacar que aunque tu en el webconfig le digas manualmente la credencial, el proxy no te lo pillará, te lo leera siempre y cuando se lo pases por el webrequest, así que olvidaros del impersonate del webconfig

Whose

Muy bueno IS4kO, enhorabuena ^^

scumah

joder, hace un mes no conocía esto, y ahora lo veo por todas partes :D
muy bueno, gracias ;)

IS4kO

#1 Edit

Para dudas o sugerencias ya sabeis ;o)

SiCk

Cojonudo, lo estaba buscando =)

1 mes después
IS4kO

Decir que en el primer ejemplo en #1 el dataSet puede ser reemplazado por un objeteo de la librería XML del framework.

En concreto el XMLDataDocument o incluso el XMLDocument. Aunque el resultado es el mismo en cuanto a que el objeto nos sirve como pasarella entre el RSS y el formateador XSLT, ahorramos bastantes recursos de sistema con ello.

salud2

Usuarios habituales

  • IS4kO
  • SiCk
  • scumah
  • Whose
  • Archville
  • erdanblo