C#: WebClient descarga el código fuente de una página HTML en lugar del recurso real

StackOverflow https://stackoverflow.com/questions/6310050

  •  26-10-2019
  •  | 
  •  

Pregunta

Adopté este código de uno de los blogs de MSDN y agregué WebClient para descargar un recurso.

string formUrl = "My login url";
            string formParams = string.Format("userName={0}&password={1}&x={2}&y={3}&login={4}", "user", "password","0","0","login");
            string cookieHeader;
            WebRequest req = WebRequest.Create(formUrl);
            req.ContentType = "application/x-www-form-urlencoded";
            req.Method = "POST";
            byte[] bytes = Encoding.ASCII.GetBytes(formParams);
            req.ContentLength = bytes.Length;
            using (Stream os = req.GetRequestStream())
            {
                os.Write(bytes, 0, bytes.Length);
            }
            WebResponse resp = req.GetResponse();
            cookieHeader = resp.Headers["Set-cookie"];
            string pageSource;
            string getUrl = "Resource url";
            WebRequest getRequest = WebRequest.Create(getUrl);
            getRequest.Headers.Add("Cookie", cookieHeader);
            WebResponse getResponse = getRequest.GetResponse();
            using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
            {
                pageSource = sr.ReadToEnd();
                System.Console.WriteLine(sr.ToString());
            }

            WebClient wc = new WebClient();
            wc.Headers["Content-Type"] = "application/x-www-form-urlencoded";

            wc.DownloadFile("Resource url","C:\\abc.tgz");
            Console.Read();

Pero Abc.tgz no es lo que se supone que debe ser. Entonces, cuando lo abrí usando el bloc de notas, noté que es el archivo fuente de la página "mi url de inicio de sesión" ... ¿dónde me estoy equivocando?

¿Hay alguna propiedad de WebClient que pueda usar para ver el error ... es decir ... dirección base, etc.?

¿Fue útil?

Solución

Hagamos las cosas más simples, ¿nosotros?

public class CookiesAwareWebClient : WebClient
{
    public CookieContainer CookieContainer { get; private set; }

    public CookiesAwareWebClient()
    {
        CookieContainer = new CookieContainer();
    }

    protected override WebRequest GetWebRequest(Uri address)
    {
        var request = base.GetWebRequest(address);
        ((HttpWebRequest)request).CookieContainer = CookieContainer;
        return request;
    }
}

class Program
{
    static void Main()
    {
        using (var client = new CookiesAwareWebClient())
        {
            var values = new NameValueCollection
            {
                { "userName", "user" },
                { "password", "password" },
                { "x", "0" }, // <- I doubt the server cares about the x position of where the user clicked on the image submit button :-)
                { "y", "0" }, // <- I doubt the server cares about the y position of where the user clicked on the image submit button :-)
                { "login", "login" },
            };

            // We authenticate first
            client.UploadValues("http://example.com/login", values);

            // Now we can download
            client.DownloadFile("http://example.com/abc.tgz", @"c:\abc.tgz");
        }
    }
}

Y, por cierto, el problema con su código es que no está aprobando la cookie de autenticación emitida por el servidor cuando envió la primera solicitud a la segunda solicitud que se supone que accede a un recurso protegido. Todo lo que pases es un tipo de contenido y no hay cookies y todo. Los servidores como las cookies :-)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top