2009-04-24 57 views
16

我想写一个函数,它将网页(及其图像)保存为html页面。 我使用HttpWebRequest来请求网页内容。 我的功能看起来像在同一会话中的多个WebRequest

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

我在这里的问题是,我想在同一个会话中的所有的WebRequest和不希望创建与每个imgRequest一个新的会话,因为许多在我的网页图像的动态生成并暂时存储。所以如果我在同一个会话中发出请求,这些图像只能被提取。

回答

32

会话通常使用cookie工作。如果您希望所有请求成为同一会话的一部分,则需要在请求之间保留Cookie。您可以通过创建CookieContainer并将其提供给每个HttpWebRequest对象来完成此操作。

这里是你的代码更新为使用的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 
     } 
    }