2009-09-21 19 views
26

Necesito conservar el mismo ID de sesión cuando navego por las páginas de un sitio usando C# .Net (como un rastreador). Encontré un par de métodos, un sniffer http fue muy útil para comparar lo que mi navegador IE estaba enviando (solicitud HTTP) y recibir del servidor web (respuesta HTTP), ya que la información importante está en los encabezados (que no se muestran por el navegador). No confunda la identificación de la sesión que es pública entre el servidor y el navegador, y las variables de sesión del servidor que son privadas con el código del servidor (como php).C# mantener el ID de la sesión en httpwebrequest

WebHeaderCollection headerCollection = new WebHeaderCollection(); 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    /* save headers */ 
    for (int i = 0; i < response.Headers.Count; i++) 
    { 
    headerCollection.Add(response.Headers.AllKeys[i], response.Headers.Get(i)); 
    } 
    /* save cookies */ 
    cookieContainer = new CookieContainer(); 
    foreach (Cookie cookie in response.Cookies) 
    { 
    cookieContainer.Add(cookie); 
    } 
} 

para hacer las otras peticiones GET o POST:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
... 
/* restore PHPSESSID */ 
for (int i = 0; i < headerCollection.Count; i++) 
{ 
string key = headerCollection.GetKey(i); 
if (key == "Set-Cookie") 
{ 
    key = "Cookie"; 
} 
else 
{ 
    continue; 
} 
string value = headerCollection.Get(i); 
request.Headers.Add(key, value); 
} 
/* restore cookies */ 
request.CookieContainer = cookieContainer; 
/* complete request */ 
Stream writeStream = request.GetRequestStream() 

Mi petición es contribuir con un mejor código o ideas adicionales para hacer una mejor sesión de preservar rastreador.

+0

favor haga un esfuerzo para dar formato a su código. http://stackoverflow.com/editing-help – spender

Respuesta

54

Si crea un único contenedor de galletas y asigna a que tanto su primera y segunda petición que no tendrá que hacer todo lo que curioseaba copiar las cookies de la respuesta.

Cuando las galletas son fijados por una respuesta del contenedor de cookies que se adjunta la solicitud va a recibir y almacenar esas galletas. Por lo tanto, para mantener el mismo contexto de sesión entre una serie de solicitudes, simplemente mantenga una sola instancia de contenedor de cookies y utilícela con todas las solicitudes.

Su código se convierte en: -

cookieContainer = new CookieContainer(); 
request.CookieContainer = cookieContainer; 
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) 
{ 
    // Do stuff with response 
} 

a continuación: -

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); 
... 

request.CookieContainer = cookieContainer; 
Stream writeStream = request.GetRequestStream() 
+1

Guardas el día hermano, muchas gracias – vbtheory

Cuestiones relacionadas