2009-04-24 15 views
16

Próbuję napisać funkcję, która zapisuje stronę (wraz z jej obrazami) jako stronę html. Używam HttpWebRequest do żądania zawartości stron internetowych. Moja funkcja wygląda coś jakWiele WebRequest w tej samej sesji

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

Mój problem polega na tym, że chcą, aby cały WebRequest w tej samej sesji i dont chcesz utworzyć nową sesję z każdym imgRequest, jak wiele z tych obrazów na mojej stronie są generowane dynamicznie i są tymczasowo przechowywane. więc te obrazy mogą zostać pobrane tylko wtedy, gdy zgłoszę żądanie w tej samej sesji.

Odpowiedz

32

Sesje na ogół działają za pomocą plików cookie. Jeśli chcesz, aby wszystkie Twoje żądania były częścią tej samej sesji, musisz zachować pliki cookie między żądaniami. Robisz to, tworząc CookieContainer i dostarczając go do każdego z obiektów HttpWebRequest.

Oto twój kod aktualizowane użyć 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 
     } 
    } 
Powiązane problemy