2009-06-28 6 views
24

Sto provando a creare una sessione HttpWebRequest/HttpWebResponse con un sito Web ASP.NET per analizzare in un secondo momento un modulo HTML tramite i parametri url (questa parte lo so come fare), ma non capisco come analizzare e impostare un cookie come l'ID di sessione. In Fiddler, mostra che l'ID sessione ASP.NET viene restituito tramite Set-Cookie nella risposta alla richiesta al/percorso dell'URL, ma come posso estrarre questo ID di sessione e impostarlo come cookie per il prossimo HttpWebRequest ? Capisco che questa intestazione Set-Cookie sia presente in HttpWebResponse.Headers.Keys, ma esiste un percorso diretto per analizzarlo? Grazie!Come analizzare HttpWebResponse.Headers.Keys per un ID sessione Set-Cookie restituito

+1

Prego! –

risposta

54

Il framework .NET gestirà i cookie per te. Non devi preoccuparti di analizzare le informazioni sui cookie dalle intestazioni o aggiungere un'intestazione del cookie alle tue richieste.

Per memorizzare e inviare l'ID sessione, utilizzare le classi Cookie e CookieContainer per archiviarle e quindi assicurarsi di inviare i cookie con ogni richiesta.

L'esempio seguente mostra come eseguire questa operazione. Il CookieContainer, 'cookieJar' può essere condiviso su più domini e richieste. Una volta aggiunto a un oggetto richiesta, il riferimento ad esso verrà aggiunto anche all'oggetto risposta quando viene restituita la risposta.

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

Il risultato di questo codice sarà:

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

+0

Grazie mille !!! Questo mi aiuterà davvero !!! Sìì! :) –

+0

L'ho implementato e funziona! Grazie mille. –

+0

+1 Grazie per l'aiuto molto apprezzato! Non vedevo l'ora di analizzare manualmente le intestazioni HTTP :) – jv42

7

La risposta da Dan Herbert mi ha aiutato molto. Apprezzo il vostro aiuto.

Voglio solo postare il mio utilizzo - spero che ne aiuti qualcuno ad un certo punto del tempo. Il mio requisito è che ho bisogno di inviare i cookie dalla prima risposta http post alla seconda richiesta di post http.

1 °:

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

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

2 °:

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

ronzio I può essere sbagliato, ma da quello che sto osservando ultimamente

cookie da una prima risposta, non includere il ' imposta cookie come cookie che arrivano nell'intestazione (ad esempio un id di sessione ...) nel caso di uno stato 302 (reindirizzamento)

Se autofollowredirect è impostato su true, il cookie impostato viene elaborato e la richiesta successiva che viene eseguita automaticamente includerà quei cookie definiti da set cookie sulla prima chiamata

Se autofollowredirect è impostato su false, il prima richiesta non ottiene i cookie posizionati dal cookie impostato, e suppongo e questa è anche la mia ricerca se qualcuno lo sa, che l'unico modo per avere successivamente quei cookie nella prossima richiesta, è analizzare i cookie impostati?

+0

Ho riscontrato problemi con un reindirizzamento 302 e impostato AllowAutoRedirect = false. Questo mi ha dato una risposta "questa pagina è stata spostata", ma poi ho passato i cookie e reindirizzato alla pagina che volevo andare in primo luogo. – Daryl

+1

[Secondo RFC 6265] (http://tools.ietf.org/html/rfc6265#section-3) Gli agenti utente POSSONO ignorare le intestazioni Set-Cookie contenute nelle risposte con codici di stato a 100 livelli ma DEVE elaborare Set-Cookie intestazioni contenute in altre risposte (comprese le risposte con 400- e codici di stato a 500 livelli). – Snives

5

Ho lo stesso problema (con amazon) Io uso il seguente espressione regolare:

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 che mi interessa solo il cookie nome/valore ...

buona fortuna Elia

+0

Questo è il tipo esatto di soluzione che sto cercando (l'oggetto WebBrowser fornisce solo una stringa per il cookie). Tuttavia, il tuo codice non viene compilato. – Nuzzolilo