Хорошо, я слишком долго ломал голову над этим соло.Мне не удалось взломать его даже за часы, проведенные на этом и многих других сайтах.
По сути, я пытаюсь удалить некоторые данные с веб-страницы за страницей входа в систему с помощью WebRequest / Response. (Я получил это для работы с использованием элемента управления WebBrowser с некоторыми многоуровневыми событиями, которые переходят на разные веб-страницы, но это вызывает некоторые проблемы при попытке рефакторинга - не говоря уже о том, что было заявлено, что для выполнения работы используется скрытая формаэто «плохая практика».)
Вот что у меня есть:
string formParams = string.Format("j_username={0}&j_password={1}", userName, userPass);
string cookieHeader;
WebRequest request = WebRequest.Create(_signInPage);
request.ContentType = "text/plain";
request.Method = "POST";
byte[] bytes = Encoding.ASCII.GetBytes(formParams);
request.ContentLength = bytes.Length;
using (Stream os = request.GetRequestStream())
{
os.Write(bytes, 0, bytes.Length);
}
WebResponse response = request.GetResponse();
cookieHeader = response.Headers["Set-Cookie"];
WebRequest getRequest = WebRequest.Create(sessionHistoryPage);
getRequest.Method = "GET";
getRequest.Headers.Add("Cookie", cookieHeader);
WebResponse getResponse = getRequest.GetResponse();
try
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
textBox1.AppendText(sr.ReadToEnd());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
Пока что я могу попасть на нужную страницу по первой ссылке, но когдаЯ перехожу ко второму: он отправляет меня обратно на страницу входа, как будто я не вошел в систему.
Проблема может заключаться в неправильной записи файлов cookie, но я новичок, поэтому, возможно, япросто делаю это неправильно.Он захватывает файлы cookie, отправленные обратно из POST: JSESSIONID и S2V, однако, когда мы переходим в «GET», используя FireFox WebConsole, браузер показывает, что он отправляет JSESSIONID, S2V и SPRING_SECURITY_REMEMBER_ME_COOKIE, что, я считаю,это файл cookie, который используется, когда я нажимаю на поле «Запомнить меня» в форме входа в систему.
Я пробовал много разных способов сделать это, используя ресурсы SO, но мне еще предстоит перейти на нужную мне страницу,Итак, ради волос, которые у меня остались, я решил обратиться за помощью к хорошему оле СО. (Это одна из тех вещей, от которых я не хочу отказываться - иногда такая упрямая)
Если кто-то хочет узнать фактический адрес сайта, на который я пытаюсь войтиЯ был бы более чем счастлив отправить его нескольким людям в личном сообщении.
Код, который я должен отразить предлагаемый ответ Уолла:
var request = (HttpWebRequest)WebRequest.Create(sessionHistoryPage);
request.Credentials = new NetworkCredential(userName, userPass);
request.CookieContainer = new CookieContainer();
request.PreAuthenticate = true;
WebResponse getResponse = request.GetResponse();
try
{
using (StreamReader sr = new StreamReader(getResponse.GetResponseStream()))
{
textBox1.AppendText(sr.ReadToEnd());
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
throw;
}
Это предложение,по крайней мере, способ, которым я это реализовал, не сработал.
Как предложил Krizz, я изменил код для использования CookieContainer и переноса файлов cookie из одного запроса в другой, однако ответ просто возвращает мне оригиналСтраница входа, как если бы я не входил в систему.
Существуют ли определенные сайты, которые просто НЕ ДОПУСКАЮТ такого поведения?
Окончательное решение
Окончательное решение было предложено Адрианом Ифтоде, в котором он заявил, что веб-сайт, на который я пытаюсь войти , может не разрешить иметь аутентификацию без действительного сеанса , поэтому добавление GET в начало процесса позволиломне, чтобы получить это печенье.
Спасибо за вашу помощь, ребята!