[Dead]如何使用异步回发成功POST到旧的ASP.NET站点

时间:2011-11-27 03:33:36

标签: php javascript asp.net curl updatepanel

[更新]不幸的是我没有机会解决这个问题。但是,下面有一些有趣的回答值得尝试其他想要做类似事情的读者。

我正在尝试从运行ASP.NET的站点解析数据。这个站点有一个我已成功遍历的登录页面(使用合法帐户)并存储了cookie,但是当我深入到该站点时,我需要通过异步回发更新UpdatePanel来导航它。 UpdatePanel包含我想要的数据。

我正在尝试使用PHP和curl来完成所有这些。我可以成功加载初始页面。当我使用所有相关数据(通过Firefox的Tamper Data插件获取)发布到我的目标页面时,curl返回的回显结果总是清除我的页面。通常,回显结果只会在页面下方打印出来(或者发出一些错误/乱码文本)。 curl_error()不打印任何内容,所以返回给我的内容有问题。

我很有思想从这里开始如何解决这个问题。请告诉我是否:a)你知道我得到了什么错误,b)如果甚至可以用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;

这是我从服务器收到的标题和正文(通过电子邮件发送给我自己以绕过使用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 个答案:

答案 0 :(得分:2)

一个。您在请求中声明您是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(试一试)。

答案 1 :(得分:1)

在这里,您可以使用适用于我的方法:

    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);
}

答案 2 :(得分:0)

一种不同的方法可以使用一个非常有用的PHP工具(一个模拟浏览器行为的类)来所有该作业以跟踪所有字段,通过点击发布/获取在链接或按钮上。

这里有链接:

simpletest

答案 3 :(得分:0)

我对php和curl没有任何线索,但如果我理解正确,你试图将信息发送到ASP页面。也许问题是页面激活了CausesValidation选项。所以,服务器不允许外部POST到页面。