2009-09-21 9 views
26

Muszę zachować ten sam identyfikator sesji podczas nawigowania po stronach witryny za pomocą C# .Net (jak robota). Znalazłem kilka metod, sniffer http był bardzo przydatny, aby porównać to, co moja IE przeglądarka wysłała (żądanie HTTP) i odbiór z serwera WWW (odpowiedź HTTP), ponieważ ważne informacje znajdują się w nagłówkach (które nie są wyświetlane przez przeglądarkę). Nie należy wprowadzać zamieszania między identyfikatorem sesji, który jest publiczny z serwera do przeglądarki, a zmiennymi sesji serwera, które są prywatne dla kodu serwera (np. Php).C# keep session id over 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); 
    } 
} 

do innych żądań GET lub 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() 

Moja prośba jest przyczynienie się z lepszą kodu lub dodatkowych pomysłów, aby lepiej sesja gąsienicowy zachowaniu.

+0

należy dołożyć starań, aby sformatować kod. http://stackoverflow.com/editing-help – spender

Odpowiedz

54

Jeśli utworzysz pojedynczy kontener z ciasteczkami i przypiszesz go do pierwszego i drugiego żądania, nie będziesz musiał wykonywać wszystkich tych błedów dotyczących kopiowania plików cookie z odpowiedzi.

Po ustawieniu plików cookie w odpowiedzi na załączony pojemnik z ciasteczkiem, żądanie otrzyma i zapisze te pliki cookie. Tak więc, aby zachować ten sam kontekst sesji pomiędzy serią żądań, wystarczy utrzymywać pojedynczą instancję kontenera cookie i używać go do wszystkich żądań.

Kod staje się: -

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

następnie: -

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

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

Ratujesz dzień bracie, dziękuję bardzo – vbtheory