2009-09-21 2 views
26

Ich muss dieselbe Sitzungs-ID beibehalten, wenn ich mit C# .Net (wie ein Crawler) über die Seiten einer Website navigiere. Ich fand ein paar Methoden, ein http-Sniffer war sehr praktisch, um zu vergleichen, was mein IE-Browser (HTTP-Anfrage) und vom Webserver (HTTP-Antwort) empfing, da die wichtigen Informationen in den Kopfzeilen (die nicht angezeigt werden) durch den Browser). Bitte verwechseln Sie nicht die Session-ID, die vom Server zum Browser öffentlich ist, und die Session-Variablen des Servers, die für den Server-Code privat sind (wie PHP).C# Sitzungs-ID über httpwebrequest beibehalten

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

die andere GET oder POST-Anfragen zu machen:

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() 

Mein Wunsch ist mit besserem Code oder zusätzlichen Ideen beizutragen, eine bessere Crawler-Sitzung Erhaltung zu machen.

+0

bitte darum bemühen, Ihren Code zu formatieren. http://stackoverflow.com/editing-help – spender

Antwort

54

Wenn Sie einen einzelnen Cookie-Container erstellen und ihn sowohl der ersten als auch der zweiten Anfrage zuweisen, müssen Sie nicht alles daran setzen, Cookies von der Antwort zu kopieren.

Wenn Cookies durch eine Antwort festgelegt werden, erhält und speichert der Cookie-Container, der der Anfrage beigefügt ist, diese Cookies. Um also den gleichen Sitzungskontext zwischen einer Reihe von Anfragen zu erhalten, pflegen Sie einfach eine einzelne Cookie-Container-Instanz und verwenden Sie diese mit allen Anfragen.

Ihr Code wird: -

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

dann: -

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

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

Sie sparen den Tag Bro, vielen Dank – vbtheory