2009-06-28 5 views
24

Estoy intentando crear una sesión HttpWebRequest/HttpWebResponse con un sitio web ASP.NET para analizar posteriormente un formulario HTML a través de parámetros de URL (esta parte lo sé cómo hacerlo), pero no entiendo cómo analizar y configurar una cookie, como la identificación de la sesión. En Fiddler, muestra que la Id. De sesión de ASP.NET se devuelve a través de Set-Cookie en la respuesta a la solicitud a la/ruta de la url, pero ¿cómo puedo extraer esta id de sesión y configurarla como una cookie para la próxima HttpWebRequest? ? Entiendo que este encabezado Set-Cookie se encontraría en HttpWebResponse.Headers.Keys, pero ¿hay una ruta directa para analizarlo? ¡Gracias!Cómo analizar HttpWebResponse.Headers.Keys para una ID de sesión de Set-Cookie devuelta

+1

No hay de qué! –

Respuesta

54

.NET framework administrará las cookies por usted. No tiene que preocuparse por analizar la información de la cookie fuera de los encabezados o agregar un encabezado de cookie a sus solicitudes.

Para almacenar y enviar su ID de sesión, use las clases Cookie y CookieContainer para almacenarlas y luego asegúrese de enviar sus cookies con cada solicitud.

El siguiente ejemplo muestra cómo hacerlo. El CookieContainer, 'cookieJar' se puede compartir en múltiples dominios y solicitudes. Una vez que lo agregue a un objeto de solicitud, la referencia al mismo también se agregará al objeto de respuesta cuando se devuelva la respuesta.

CookieContainer cookieJar = new CookieContainer(); 

var request = (HttpWebRequest)HttpWebRequest.Create("http://www.google.com"); 
request.CookieContainer = cookieJar; 

var response = request.GetResponse(); 

foreach (Cookie c in cookieJar.GetCookies(request.RequestUri)) 
{ 
    Console.WriteLine("Cookie['" + c.Name + "']: " + c.Value); 
} 

La salida de este código será:

Cookie['PREF']: ID=59e9a22a8cac2435:TM=1246226400:LM=1246226400:S=tvWTnbBhK4N7Tlpu

+0

¡Muchas gracias! ¡Esto realmente me ayudará! ¡Hurra! :) –

+0

¡Implementé esto y funciona! Muchas gracias. –

+0

+1 ¡Gracias por la ayuda tan apreciada! No estaba esperando analizar manualmente los encabezados HTTP :) – jv42

7

La respuesta de Dan Herbert me ayudó realmente. Aprecio tu ayuda.

Solo quiero publicar mi uso, espero que ayude a alguien en algún momento. Mi requisito es que tengo que devolver las cookies de la primera respuesta http post a la segunda solicitud posterior a http.

primero:

CookieContainer cookieJar = new CookieContainer(); 
request.CookieContainer = cookieJar; 
.... 

CookieCollection setCookies = cookieJar.GetCookies(request.RequestUri); 

segundo:

CookieContainer cc = new CookieContainer(); 
cc.Add(setCookies);  
request.CookieContainer = cc; 
1

zumbido puedo estar equivocado, pero de lo que estoy observando

últimamente

Galletas de una primera respuesta, no incluya el " establecer cookie 'como cookies que vienen en el encabezado (por ejemplo, una identificación de sesión ...) en el caso de un estado 302 (redirigir)

Si el autofollowredirect se establece en true, la cookie configurada se procesa y la solicitud subsiguiente, que se realiza automáticamente, incluirá aquellas cookies definidas por la cookie establecida en la primera llamada

Si autofollowredirect está configurado como falso, entonces La primera solicitud no obtiene las cookies ubicadas por la cookie configurada, y supongo que este es también mi queston si alguien sabe que la única forma de tener esas cookies en la próxima solicitud es analizar las cookies establecidas.

+0

Tuve problemas con un redireccionamiento 302 y establecí AllowAutoRedirect = false. Esto me dio una respuesta de "esta página se ha movido", pero luego pasé las cookies y redirigí a la página a la que quería ir en primer lugar. – Daryl

+1

[Según RFC 6265] (http://tools.ietf.org/html/rfc6265#section-3) Los agentes de usuario PUEDEN ignorar los encabezados de Set-Cookie contenidos en las respuestas con códigos de estado de 100 niveles, pero DEBEN procesar Set-Cookie encabezados incluidos en otras respuestas (incluidas las respuestas con 400- y códigos de estado de 500 niveles). – Snives

5

que tienen el mismo problema (con Amazon) utilizo la siguiente expresión regular:

string regexp = "(?<name>[^=]+)=(?<val>[^;]+)[^,]+,?";);
MatchCollection myMatchCollection = Regex.Matches(cookiesStr, regexp);
foreach (Match myMatch in myMatchCollection)
{
string cookieName = myMatch.Groups["name"].ToString();
string cookieVal = myMatch.Groups["val"].ToString();
Cookie cookie = new Cookie(cookieName, cookieVal);
cookies.Add(cookie);
}

Nota que sólo se preocupan por la cookie de nombre/valor ...

buena suerte Elia

+0

Este es el tipo exacto de solución que estoy buscando (el objeto WebBrowser solo proporciona una cadena para la cookie). Sin embargo, su código no se compila. – Nuzzolilo

Cuestiones relacionadas