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
risposta
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
Grazie mille !!! Questo mi aiuterà davvero !!! Sìì! :) –
L'ho implementato e funziona! Grazie mille. –
+1 Grazie per l'aiuto molto apprezzato! Non vedevo l'ora di analizzare manualmente le intestazioni HTTP :) – jv42
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;
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?
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
[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
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
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
Prego! –