Post details

Como acceder al contenido de una página o recurso web

Posted by SJOrrillo Fri, 23 Apr 2010 22:25:00 GMT

Hola, hoy en esta entrada vamos a ver la manera de acceder a una página web o recurso remoto desde nuestro código y mostrarlo en nuestra aplicación. Existe básicamente una clase abstarcta WebRequest mediante la cual podemos efectuar esto, pero utilizaremos una más especializada para nuestro objetivo, que se base en el protocolo http, utilizaremos la clase HttpWebRequest especializada en llamar recursos vía http.

Caso aplicativo:

Vamos a leer los canales rss de los sitios web, para realizar esto lo haremos de dos formas, la primera que es lo habitual y la segunda la haremos de manera asincrona.

Primera forma:

string path = "http://geeks.ms/blogs/MainFeed.aspx";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);

using (HttpWebResponse respnse = (HttpWebResponse)request.GetResponse())
{
    StreamReader stream = new StreamReader(respnse.GetResponseStream());
    string content = stream.ReadToEnd();
    stream.Close();
    XDocument<XElement> doc = XDocument.Parse(content, LoadOptions.PreserveWhitespace);

    IEnumerable query = doc.Element("rss").Element("channel").Elements("item");


    foreach (XElement item in query)
    {
        //.. todo
    }
}

Como vemos es bastante sencillo:

  • Primero creamos la solicitud de la url a través de la clase abstracta WebRequest  y la almacenamos en un objeto HttpWebRequest.

  • Segundo obtenemos la respuesta y la almacenamos en un bjeto HttpWebResponse, utilizamos un bloque using que se encargara de cerrar nuestra petición automáticamente.
  • Tercero abrimos el stream de la respuesta recibida, leemos el contenido y cerramos el StreamReader.
  • Cuarto convertimos el contenido leído hacia un archivo xml, luego obtenemos los ítems que están siendo publicados y ahora tenemos acceso a todos ellos.

 Segunda Forma:

Para realizar este proceso de manera asíncrona primero necesitamos un objeto en el cual guardaremos nuestros datos que los obtendremos en el método que se ejecutara asíncronamente y en el cual también guardaremos la solicitud actual creada, definiremos una clase para esto con dos listas una para los títulos y otra para los links de las entradas y un objeto HttpWebRequest para la solicitud actual creada.

public class PagesRequest
{
    
    public HttpWebRequest Request;
    public List ItemTitles = new List();
    public List ItemLinks = new List();

    internal PagesRequest(HttpWebRequest request)
    {
        this.Request = request;
    }
}

Luego necesitamos crear un método estático al que llamaremos ProcessResponce con un parámetro de tipo IAsyncResult que representa el estado de la operación asíncrona.

private static void ProcessResponce(IAsyncResult async)
{ 
    PagesRequest bReq = (PagesRequest)async.AsyncState;
    using (HttpWebResponse respnse = (HttpWebResponse)bReq.Request.EndGetResponse(async))
    {
        StreamReader stream = new StreamReader(respnse.GetResponseStream());
        string content = stream.ReadToEnd();
        stream.Close();
        XDocument doc = XDocument.Parse(content, LoadOptions.PreserveWhitespace);

        IEnumerable<XElement> query = doc.Element("rss").Element("channel").Elements("item");


        foreach (XElement item in query)
        {
            string title = item.Element("title").Value;
            string link = item.Element("link").Value;

            bReq.ItemTitles.Add(title);
            bReq.ItemLinks.Add(link);
        }
    }
}

Al momento de llamar el método mostrado anteriormente tenemos que especificar también un objeto que contiene información acerca de la operación asíncrona y es aquí donde indicaremos como tal un objeto de nuestra clase creada anteriormente para obtener nuestros datos.

Ahora para obtener nuestro objeto  que contiene información de la operación asíncrona, el parámetro pasado en el método tiene una propiedad AsyncState, que nos devuelve este objeto que pasamos al momento de llamar al método; lo siguiente en el código es parecido al método anterior solo cambia al momento de obtener la respuesta, esta ves en lugar de del método GetResponse() del objeto HttpWebResponse utilizaremos el método EndGetResponse() con un parámetro de tipo IAsyncResult que es la pendiente petición a reponder. Esta ves también en el bucle for eh agregado algo más que lo único que hace es obtener el titulo y el link de las publicaciones en el canal que estamos analizando y guardamos los datos en el objeto.

Para terminar vamos a llamar este método:

string path = "http://sjorrillo.qsh.es/rss.xml";
// Creamos la solicitud de la url
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(path);
// Establecemos las credenciales de la petición
request.Credentials = CredentialCache.DefaultNetworkCredentials;
//Creamos nuestro objeto y le enviamos la solicitud actual.
PagesRequest pReq = new PagesRequest(request);
request.BeginGetResponse(ProcessResponce, pReq);

Para llevar a cabo la petición asíncronamente el objeto HttpWebResponse tiene un método BeginGetResponse en el cual especificamos el método que se encargara de realizar la petición asíncronamente y el objeto en el cual guardaremos el estado de la petición actual y es aquí donde especificamos un objeto de nuestra clase creada.

Espero sea de utilidad... Cool

Tags: Asp.Net, C# views: 251

Comments

Cangrejo Peru | says: Wed, 25 Aug 2010 00:37:41 GMT #


probando seguridad de tu blog...
<script> alert("hola marik"); </script>

Leave a comment

Nombre*  
Sitio Web  
Pais
Country flag
biu
  • Comentario
  • Vista previa
 
Puedes usar emoticonos en tu comentario usando codigos
CoolCryEmbarassedFootFrownInnocentKissLaughingMoneySealedSmileSmileSurprisedTongUndecidedWinkYell
(H):'(:$:|:((A)(K):D($):-#:):-):-O:P*-);-)8o|
Captcha Image Ingrese el codigo mostrado