Posts Tagged ‘HttpListener’

HttpWebRequest y los problemas con las redirecciones y las cookies

Viernes, enero 1st, 2010

¿Quién dijo que programar en .NET era coser y cantar? Hay muchas librerías que nos facilitan la vida pero a veces no funcionan del todo bien haciendo cosas raras o simplemente se les olvido incluir el control de ciertas situaciones.

Programando Squipy me he topado con un gran problema y es que cuando llego a una web que me hace una redirección (por ejemplo un 302) para que el HttpWebRequest la siga y obtenga luego la página a donde se redirige, he de poner AllowAutoRedirect = true

Pero si configuramos AllowAutoRedirect = true entonces no podremos capturar las cookies y, por tanto, no entrar a ciertas webs en las que necesitamos validación.

Si ponemos AllowAutoRedirect = false podremos capturar la cookie sin problemas usando GetResponseHeader(“Set-Cookie“) pero no se hará la redirección y no llegaremos a la página a la que se redirige.

Así que la solución final pasa por poner la redirección a false, capturar la cookie con Set-Cookie y luego comprobar el StatusCode para ver si la página devuelve una redirección, en cuyo caso, incluiremos nuestra cookie con Headers.Add(“Cookie“, nuestraCookie) y capturaremos la página a donde nos redirige con GetResponseHeader(“Location“). Tras esto crearemos manualmente otro HttpWebRequest para llamar a la nueva página.

Os dejo un código de ejemplo:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlDestino);
request.AllowAutoRedirect = false;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();

while (response.StatusCode == HttpStatusCode.Found)  {

String nuevaUrl = “http://” + response.ResponseUri.Host + response.GetResponseHeader(“Location“);
request = (HttpWebRequest) WebRequest.Create(nuevaUrl);
request.AllowAutoRedirect = false;
response = (HttpWebResponse) request.GetResponse();

}

A falta de comprobar con Set-Cookie si tenemos alguna cookie y guardarla en un contenedor de Cookies para luego usarla en el nuevo envío.

Feliz Año nuevo a todos!