2009-09-21 8 views
26

Devo conservare lo stesso ID di sessione durante la navigazione sulle pagine di un sito utilizzando C# .Net (come un crawler). Ho trovato un paio di metodi, uno sniffer http è stato molto utile, per confrontare ciò che il mio browser IE stava inviando (richiesta HTTP) e ricevendo dal server web (risposta HTTP), poiché le informazioni importanti sono nelle intestazioni (che non vengono visualizzate dal browser). Si prega di non creare confusione tra l'ID di sessione che è pubblico dal server al browser e le variabili di sessione del server che sono private al codice del server (come php).C# mantiene l'ID di sessione su 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); 
    } 
} 

per rendere le altre richieste 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() 

La mia richiesta è quello di contribuire con il codice migliore, o ulteriori idee per rendere una migliore sessione di crawler preservare.

+0

si prega di fare uno sforzo per formattare il codice. http://stackoverflow.com/editing-help – spender

risposta

54

Se si crea un contenitore di cookie singolo e lo si assegna sia alla prima sia alla seconda richiesta, non sarà necessario eseguire tutte queste operazioni di copia dei cookie dalla risposta.

Quando i cookie vengono impostati da una risposta, il contenitore dei cookie che è allegato alla richiesta riceverà e memorizzerà tali cookie. Pertanto, per mantenere lo stesso contesto di sessione tra una serie di richieste, è sufficiente mantenere un'unica istanza del contenitore di cookie e utilizzarla con tutte le richieste.

il codice diventa: -

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

poi: -

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

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

Hai salvato il fratello giorno, grazie mille – vbtheory

Problemi correlati