Múltiples WebRequest en la misma sesión

2 minutos de lectura

Estoy tratando de escribir una función que guarde una página web (con sus imágenes) como una página html. Estoy usando HttpWebRequest para solicitar el contenido de las páginas web. Mi función se ve algo como

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

Mi problema aquí es que quiero hacer todas las solicitudes web en la misma sesión y no quiero crear una nueva sesión con cada solicitud img, ya que muchas de las imágenes en mi página web se generan dinámicamente y se almacenan temporalmente. por lo tanto, esas imágenes solo se pueden recuperar si hago una solicitud en la misma sesión.

Las sesiones generalmente funcionan mediante el uso de cookies. Si desea que todas sus solicitudes formen parte de la misma sesión, debe conservar las cookies entre solicitudes. Para ello, crea un CookieContainer y lo proporciona a cada uno de los objetos HttpWebRequest.

Aquí está su código actualizado para usar 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
        }
    }

  • Incluso funciona si imgRequest y webRequest son la misma variable. Muchas gracias por la solución.

    – GSandro_Fuertes

    27 ago. 2020 a las 22:29

.

¿Ha sido útil esta solución?