Как успешно выполнить POST на старый сайт ASP.NET с использованием асинхронной обратной передачи

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

Я пытаюсь проанализировать данные с сайта ASP.NET. На этом сайте есть страница входа, которую я успешно прошел (используя законную учетную запись), и сохранил файл cookie, но когда я углубляюсь в сайт, мне нужно его перемещать, обновляя UpdatePanels через Asynchronous Postbacks. В UpdatePanels содержатся данные, которые я хочу.

Я пытаюсь сделать все это с помощью PHP и завитки. Я могу успешно загрузить начальную страницу. Когда я отправляю POST на свою целевую страницу со всеми соответствующими данными (полученными через плагин Firefox Tamper Data), эхо-результат, возвращаемый из curl, всегда очищает мою страницу. Как правило, повторение результата просто распечатывает (или выводит текст с ошибкой / искажением) дальше по странице. curl_error () ничего не распечатывает, поэтому что-то не так с тем, что мне возвращается.

Я в конце концов о том, как это сделать отсюда. Скажите, пожалуйста, если: a) вы знаете, какую ошибку я получаю, б) если это будет возможно только с исключительно PHP, и c) если, наоборот, мне нужно очистить javascript, чтобы взаимодействовать с ASP.NET UpdatePanels ,

$uri = "TARGETURL"; $cl=curl_init(); curl_setopt($cl, CURLOPT_URL, $uri); curl_setopt($cl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0'); curl_setopt($cl, CURLOPT_COOKIEFILE, "/tmp/cookie2.txt"); curl_setopt($cl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($cl, CURLOPT_CONNECTTIMEOUT, 0); curl_setopt($cl, CURLOPT_POST, 1); $postdata=array( "__VIEWSTATE" => $viewstate, "OTHER DATA" => "asdfkljsddflkjshdjf", "__ASYNCPOST" => "true", ); echo "<PRE>"; print_r($postdata); echo "</PRE>"; curl_setopt ($cl, CURLOPT_POSTFIELDS, $postdata); $result = curl_exec($cl); // execute the curl command echo $result; 

Вот заголовок и тело, которые я получаю с сервера (отправлено по электронной почте самому себе, чтобы обойти очистку страницы, происходящее с выражением эха):

 HEADER RESPONSE: HTTP/1.1 100 Continue HTTP/1.1 200 OK Cache-Control: no-cache Pragma: no-cache Content-Type: text/plain; charset=utf-8 Expires: -1 Server: Microsoft-IIS/7.5 X-Content-Type-Options: nosniff Set-Cookie: culture=en-US; expires=Tue, 27-Nov-2012 20:02:37 GMT; path=/ X-Powered-By: ASP.NET Date: Mon, 28 Nov 2011 20:02:37 GMT Content-Length: 112 BODY RESPONSE: 69|dataItem||<script type="text/javascript">window.location="about:blank"</script>|11|pageRedirect||/Error.aspx| 

Это объясняет проблему, с которой я столкнулся с пустой страницей (javascript перенаправляет вывод моего браузера). Это также указывает на то, что заголовок не является проблемой, так как я получаю ошибку HTTP из плохих значений заголовка.

О. Вы заявляете в своем запросе, что вы браузер Firefox:

curl_setopt($cl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:5.0) Gecko/20100101 Firefox/5.0');

Не утверждайте, что вы Firefox:

  • если вы не можете обрабатывать скрипты (как Firefox может и делает)
  • если вы хотите, чтобы ASP.NET не отправлял вам частичный ответ рендеринга

Создайте собственное имя агента или не отправляйте его вообще.

ASP.NET проверяет, поддерживает ли пользовательский агент обратные вызовы: HttpCapabilitiesBase.SupportsCallback Property

B. Не отправляйте __ASYNCPOST = true (попробуйте).

В другом подходе может использоваться очень полезный PHP-инструмент (класс, имитирующий поведение браузера), который выполняет всю работу, чтобы отслеживать все поля, делать сообщения / получать, нажимая ссылки или кнопки.

Здесь ссылка:

SimpleTest

У меня нет никакой информации о php и curl, но если я правильно понимаю, вы пытаетесь отправить информацию на страницу ASP. Возможно, проблема в том, что на странице CausesValidation опция CausesValidation . поэтому сервер не разрешает внешние POST-сообщения на странице.

Здесь вы добавили подход, который работает для меня:

  public function doPostbackToAspDotNetPage() { $uri = '*** THE_URL ***'; $cl = curl_init(); curl_setopt($cl, CURLOPT_URL, $uri); curl_setopt($cl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:54.0) Gecko/20100101 Firefox/54.0'); curl_setopt($cl, CURLOPT_COOKIESESSION, '*** OPTIONAL ***'); curl_setopt($cl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($cl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($cl, CURLOPT_CONNECTTIMEOUT, 0); curl_setopt($cl, CURLOPT_POST, 1); // Just in case the url is https and the certification gives some kind of error curl_setopt($cl, CURLOPT_SSL_VERIFYHOST, false); curl_setopt($cl, CURLOPT_SSL_VERIFYPEER, false); $postdata = array( '__EVENTTARGET' => '*** A value such as: SOME_ID$ctl20$ctl02 ***', '__EVENTARGUMENT' => ' *** OPTIONAL ***', "__VIEWSTATE" => '*** REQUIRED BUNCH OF CHARACTERS ***', "__ASYNCPOST" => "true", '__VIEWSTATEGENERATOR' => '*** OPTIONAL ***', '__EVENTVALIDATION' => "*** REQUIRED BUNCH OF CHARACTERS ***", ); curl_setopt($cl, CURLOPT_POSTFIELDS, $postdata); $result = curl_exec($cl); if (!$result) { echo sprintf('ERROR:%s', PHP_EOL); echo curl_error($cl); } else { echo $result; } curl_close($cl); }