C # сохранить идентификатор сеанса через httpwebrequest - PullRequest
27 голосов
/ 21 сентября 2009

Мне нужно сохранить тот же идентификатор сеанса при навигации по страницам сайта с использованием C # .Net (например, сканер). Я нашел пару методов, http sniffer был очень удобен для сравнения того, что мой браузер IE отправлял (HTTP-запрос) и получал с веб-сервера (HTTP-ответ), поскольку важная информация находится в заголовках (которые не отображаются браузером). Пожалуйста, не путайте идентификатор сеанса, который общедоступен от сервера к браузеру, и переменные сеанса сервера, которые являются частными для кода сервера (например, php).

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

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

1 Ответ

56 голосов
/ 21 сентября 2009

Если вы создадите один контейнер 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...