2009-09-21 1 views
26

Мне нужно сохранить один и тот же идентификатор сеанса при навигации по страницам сайта с помощью C# .Net (например, сканера). Я нашел несколько методов, http-сниффер был очень удобен, чтобы сравнить то, что отправлял мой браузер IE (HTTP-запрос), и получать с веб-сервера (HTTP-ответ), поскольку важная информация находится в заголовках (которые не отображаются браузером). Не допускайте путаницы между идентификатором сеанса, который является общедоступным с сервера на браузер, и переменными сеанса сервера, которые являются частным для кода сервера (например, php).C# содержать идентификатор сеанса над 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); 
    } 
} 

сделать другие GET или 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() 

Моя просьба заключается в содействии с лучшим кодом, или дополнительные идеи, чтобы сделать лучше сессии гусеничный сохранения.

+0

пожалуйста, приложить усилия для форматирования кода. http://stackoverflow.com/editing-help – spender

ответ

54

Если вы создаете единый контейнер для файлов cookie и назначаете это как для своего первого, так и для второго запроса, вам не нужно будет делать все это, когда вы будете копировать файлы cookie из ответа.

Когда cookie задается ответом, контейнер cookie, к которому прикреплен запрос, будет получать и хранить эти файлы cookie. Таким образом, чтобы поддерживать тот же контекст сеанса между последовательностью запросов, просто поддерживайте один экземпляр контейнера cookie и используйте его со всеми запросами.

Ваш код становится: -

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

затем: -

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

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

Вы экономите день, спасибо, большое спасибо – vbtheory

Смежные вопросы