2009-04-24 7 views
16

J'essaye d'écrire une fonction qui enregistre une page Web (avec ses images) comme une page html. J'utilise HttpWebRequest pour demander le contenu de pages Web. Ma fonction ressembleWebRequest multiple dans la même session

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

Mon problème ici est que je veux faire toute la WebRequest en même session et ne veulent pas créer une nouvelle session avec chaque imgRequest, autant des images sur ma page Web sont générées dynamiquement et sont stockés temporairement. donc ces images ne peuvent être récupérées que si je fais une demande dans la même session.

Répondre

32

Les sessions fonctionnent généralement en utilisant des cookies. Si vous souhaitez que toutes vos demandes fassent partie de la même session, vous devez conserver les cookies entre les demandes. Vous le faites en créant un CookieContainer et en le fournissant à chacun des objets HttpWebRequest.

Voici votre code mis à jour pour utiliser 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 
     } 
    } 
Questions connexes