[Dead] Как успешно POST на старый сайт ASP.NET с использованием асинхронной обратной передачи - PullRequest
8 голосов
/ 27 ноября 2011

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

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

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

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

$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 "";
print_r($postdata);
echo "
"; curl_setopt ($ cl, CURLOPT_POSTFIELDS, $ postdata); $ result = curl_exec ($ cl); // выполнить команду curl echo $ result;

ЗдесьЗаголовок и Тело, которые я получаю обратно с сервера (отправленные мне по электронной почте, чтобы обойти очистку страницы с помощью оператора echo):

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 из-за неправильных значений заголовка.

Ответы [ 4 ]

2 голосов
/ 29 июня 2012

A. В своем запросе вы указываете, что являетесь браузером 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

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

1 голос
/ 22 июня 2017

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

    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);
}
0 голосов
/ 21 сентября 2012

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

0 голосов
/ 30 ноября 2011

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

Вот ссылка:

simpletest

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