Несколько WebRequest в одном сеансе - PullRequest
16 голосов
/ 25 апреля 2009

Я пытаюсь написать функцию, которая сохраняет веб-страницу (с ее изображениями) в виде 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
    }
}

Моя проблема здесь в том, что я хочу сделать все веб-запросы в одном сеансе и не хочу создавать новый сеанс с каждым imgRequest, так как многие изображения на моей веб-странице генерируются динамически и временно сохраняются. таким образом, эти изображения могут быть получены только если я сделаю запрос в том же сеансе.

1 Ответ

32 голосов
/ 25 апреля 2009

Сессии обычно работают с использованием файлов 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
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...