同一會話中的多個 WebRequest

itchaindev發表於2022-04-02

問題

我正在嘗試編寫一個將網頁(及其影像)儲存為 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
    }}

我的問題是我想在同一個會話中建立所有 webrequest,並且不想為每個 imgRequest 建立一個新會話,因為我網頁上的許多影像都是動態生成的並且是臨時儲存的。 所以只有當我在同一個會話中發出請求時才能獲取這些影像。


答案

會話通常使用 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
        }
    }


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016198/viewspace-2885443/,如需轉載,請註明出處,否則將追究法律責任。

相關文章