2009-04-24 18 views
16

Sto provando a scrivere una funzione che salva una pagina Web (con le sue immagini) come una pagina HTML. Sto usando HttpWebRequest per richiedere il contenuto delle pagine web. mia funzione simile aWebRequest multiplo nella stessa sessione

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 
    } 
} 

mio problema qui è che voglio fare la WebRequest in stessa sessione e non voglio creare una nuova sessione con ogni imgRequest, come molte delle immagini sulla mia pagina web sono generate dinamicamente e sono memorizzati temporaneamente. quindi queste immagini possono essere recuperate solo se faccio una richiesta nella stessa sessione.

risposta

32

Le sessioni funzionano generalmente utilizzando i cookie. Se si desidera che tutte le richieste facciano parte della stessa sessione, è necessario mantenere i cookie tra le richieste. A tale scopo, crea un cookieContainer e lo fornisce a ciascuno degli oggetti HttpWebRequest.

Ecco il tuo codice aggiornato per utilizzare 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 
     } 
    } 
Problemi correlati