我正在尝试编写一个将网页(及其图像)保存为html页面的功能.我正在使用HttpWebRequest来请求网页的内容.我的功能看起来像
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
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我想在同一个会话中创建所有webrequest并且不想为每个imgRequest创建一个新会话,因为我的网页上的许多图像都是动态生成的并且是临时存储的.因此,如果我在同一会话中发出请求,则只能获取这些图像.
Erv*_*ter 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
}
}
Run Code Online (Sandbox Code Playgroud)