2009-04-24 26 views
16

Estoy intentando escribir una función que guarda una página web (con sus imágenes) como una página html. Estoy usando HttpWebRequest para solicitar el contenido de las páginas web. Mi función se ve algo comoMultiple WebRequest en la misma sesión

void SaveUrl(string sourceURL, string savepath) 
{ 
    HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(sourceURL); 
    HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse(); 
    StreamReader responseReader = new StreamReader(response.GetResponseStream()); 

    string sResponseHTML = responseReader.ReadToEnd(); 
    using (StreamWriter sw = new StreamWriter(savepath, false)) 
    { 
     sw.Write(sResponseHTML); 
    } 

    string[] ImageUrl = GetImgLinks(sResponseHTML); 
    foreach (string imagelink in ImageUrl) 
    { 
     HttpWebRequest imgRequest = (HttpWebRequest)WebRequest.Create(imagelink); 
     HttpWebResponse imgresponse = (HttpWebResponse)imgRequest.GetResponse(); 
     //Code to save image 
    } 
} 

Mi problema aquí es que quiero hacer toda la WebRequest en una misma sesión y no desea crear una nueva sesión con cada imgRequest, ya que muchas de las imágenes en mi página web se generan de forma dinámica y se almacenan temporalmente. entonces esas imágenes solo pueden buscarse si realizo una solicitud en la misma sesión.

Respuesta

32

Las sesiones generalmente funcionan mediante el uso de cookies. Si desea que todas sus solicitudes formen parte de la misma sesión, debe conservar las cookies entre las solicitudes. Para ello, cree un CookieContainer y proporciónelo a cada uno de los objetos HttpWebRequest.

Aquí está el código actualizado para utilizar un CookieContainer:

void SaveUrl(string sourceURL, string savepath) { 
     CookieContainer cookies = new CookieContainer(); 
     HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(sourceURL); 
     webRequest.CookieContainer = cookies; 

     HttpWebResponse response = (HttpWebResponse)webRequest.GetResponse(); 
     StreamReader responseReader = new StreamReader(response.GetResponseStream()); 

     string sResponseHTML = responseReader.ReadToEnd(); 
     using (StreamWriter sw = new StreamWriter(savepath, false)) { 
      sw.Write(sResponseHTML); 
     } 

     string[] ImageUrl = GetImgLinks(sResponseHTML); 
     foreach (string imagelink in ImageUrl) { 
      HttpWebRequest imgRequest = (HttpWebRequest)WebRequest.Create(imagelink); 
      imgRequest.CookieContainer = cookies; 
      HttpWebResponse imgresponse = (HttpWebResponse)imgRequest.GetResponse(); 
      //Code to save image 
     } 
    } 
Cuestiones relacionadas