досадно! POST возвращает 302 найденную ошибку перемещения объекта в HttpWebRequest - PullRequest
2 голосов
/ 14 августа 2010

Кто-то, пожалуйста, помогите - боролся с этой паршивой проблемой!

Что я делаю - у меня есть страница ASPX, с которой я создаю GET, а затем POST к HTTPS страница с целью авторизации на нем.Я потратил довольно много времени, сравнивая мою конструкцию GET и POST с браузером GET / POST, используя fiddler (анализатор протокола), и мои запросы в порядке.

Однако, когда я пытаюсь войти через браузер, все работаетхорошо, и он входит в систему. Когда я запускаю свою страницу, я вижу правильные значения GET и POST, но я получаю 302 найденных «объект перемещен ошибка»

Первоначально я думал, что это проблема с cookie, но после большогоЭксперименты Я уверен, что это не имеет ничего общего с куки.Я отключил куки и JavaScript в браузере и попытался, и страницы работают без них.Затем я смоделировал точный GET / POST.

Это моя ситуация:

  1. Мой GET и браузеры GET точно такие же
  2. Ответ 200 OK сайта точно такой же, за исключением трех VIEWSTATEпеременные, которые имеют немного различную длину (почему? почему различаются, даже если GET одинаков?)
  3. Мой POST и POST для браузеров Точно одинаковы, КРОМЕ 3 переменных Viewstate (я заполняю их правильно из GET)
  4. И все же браузер входит в систему, в то время как я получаю 302 найденных / ошибочных перемещенных объектов.

Пара других вещей -

a) Я скопировал POSTответ от недавнего POST браузера и заменил мои параметры POST на этот POST браузера, и это дало мне правильный ответ!Это означает, что
- мои заголовки просто в порядке
- мои настройки кодирования / окружение и т. Д. В порядке
- что-то подозрительное в значениях VIEWSTATE, что может быть только потому, что браузер отправил его мне в первомместо (нет никакого искажения в моем разборе переменных GET VIEWSTATE и использовании его в POST, это прекрасно)

update Я также попробовал WebClient просто проверить - без разницы, те же 302. update Объект, перемещенный в основном, указывает на страницу с ошибкой, на которой говорится, что «произошла серьезная ошибка, бла-бла» - POST вызывает ошибку на сервере, и ЕДИНСТВЕННАЯ разница между хорошим POST (браузером).) и мой POST - это переменные Viewstate.

Итак - ЧТО Я ДЕЛАЮ НЕПРАВИЛЬНО?Почему этот жестокий мир мучает меня? !!

(PS - еще одно отличие в последовательности браузера, не знаю, как это важно)

Browser:<br> CONNECT<br> GET<br> GET (for a favicon, which returns an error)<br> CONNECT<br> POST (success)<br> Me:<br> CONNECT<br> GET<br> POST (flaming failure, 302 - page moved)<br>

и дляте, кого это волнует, мой код постройки заголовка POST

    HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(URL);
    myRequest.UserAgent = chromeUserAgent;

    //myRequest.CookieContainer = cCookies;
    myRequest.ContentType = "application/x-www-form-urlencoded";
    myRequest.Accept = chromeAccept;
    myRequest.Referer = url;
    myRequest.AllowAutoRedirect = false;
    myRequest.Host = "thesitethatskillingme.com";
    myRequest.Headers.Add("Origin", "https://thesitethatskillingme.com");
    myRequest.Headers.Add("Accept-Encoding", chromeAcceptEncoding);
    myRequest.Headers.Add("Accept-Language", chromeAcceptLanguage);
    myRequest.Headers.Add("Accept-Charset", chromeAcceptCharset);
    myRequest.Headers.Add("Cache-Control", "max-age=0");
    myRequest.ServicePoint.Expect100Continue = false;
    myRequest.Method = "POST";
    myRequest.KeepAlive = true;

    ASCIIEncoding ascii = new ASCIIEncoding();
    byte[] bData = ascii.GetBytes(data);

    myRequest.ContentLength = bData.Length;

    using (Stream oStream = myRequest.GetRequestStream())
        oStream.Write(bData, 0, bData.Length);

... а затем прочитайте поток и т. д. без файлов cookie.

1 Ответ

4 голосов
/ 15 августа 2010

Я наконец-то понял это - и, надеюсь, кому-то другому, кто столкнется с той же проблемой, не придется проходить через это снова. Вполне возможно, что большинство HTTP-гуру и людей, знакомых с WWW-разработкой, никогда этого не сделают, но новичок вполне может.

Так в чем была проблема? Я сузил проблему до VIEWSTATE, о которой я всегда подозревал (см. Мой пост выше ...). Оказывается, все, что мне нужно было сделать, это Server.UrlEncode проанализировать значения VIEWSTATE, прежде чем поместить их в POST - вот и все. Мне потребовался целый день, чтобы добраться до этого.

ТАК, как обучение другим новичкам

  • Если вы пытаетесь отправить POST на страницу с помощью кода и вам нужно отправить ей переменные VIEWSTATE, которые вы проанализировали из GET, то сначала Server.UrlEncode перед созданием параметров - например,

    </p></li> <li>do GET</li> <li>get the response stream into a string</li> <li>parse the string (I use HtmlAgilityPack- fabulous)</li> <li>param1 = name +"="+Server.UrlEncode(value)+"&"</li> <li>POST param = param1+param2+... -send this in POST - voila, it works</li> </ul> <p>

    , поскольку я никогда не программировал с помощью HttpWebRequest и т. Д., Я начал с того, что сузил свою проблему, исключив файлы cookie, javascript, конструкцию GET, конструкцию POST по одному, используя fiddler (отличный инструмент для анализа, бесплатный), а затем, наконец сделал сравнение байтов с помощью BeyondCompare, и тогда я поймал изменения переменной VIEWSTATE.

    Я выучил урок по кодированию URL, и, надеюсь, вам не придется!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...