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