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

Posted

技术标签:

【中文标题】[Dead]如何使用异步回发成功 POST 到旧的 ASP.NET 站点【英文标题】:[Dead]How to successfully POST to an old ASP.NET site utilizing Asynchronous Postback 【发布时间】:2012-01-07 04:20:49 【问题描述】:

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

我正在尝试解析来自运行 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 错误。

【问题讨论】:

只需要对ajax请求的数据进行调和并完全模仿它。目标网址是什么?可能像__EVENTTARGET __EVENTARGUMENT 一样失踪了 出于保密考虑已将其删除。与 __EVENTTARGET 和 __EVENTARGUMENT 相同(尽管我知道这两个具有正确的参数)。 但是是的,因为它不是 SSL,您可以使用 Wireshark 轻松嗅探流量并查看请求中的哪一行或您未发送的标头。尝试将所有内容模仿为字节。 感谢您的信息。我检查了 Wireshark,并决定我可能需要投入大量时间。当我有机会时,我会回到那个地方。谢谢。 可能会打开一扇门,但只是询问您正在抓取的网站询问他们是否有 API、RSS 提要甚至生成的 XML 文件来访问您的数据不是更容易吗想要。 【参考方案1】:

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 Property

B.不要发送__ASYNCPOST = true(试试看)。

【讨论】:

【参考方案2】:

这是一种适用于我的改进方法:

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

【讨论】:

【参考方案3】:

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

这里是链接:

simpletest

【讨论】:

【参考方案4】:

我对 php 和 curl 一无所知,但如果我理解正确,您正在尝试将信息发送到 ASP 页面。可能问题在于页面激活了CausesValidation 选项。因此,服务器不允许外部 POST 到页面。

【讨论】:

以上是关于[Dead]如何使用异步回发成功 POST 到旧的 ASP.NET 站点的主要内容,如果未能解决你的问题,请参考以下文章

在 Visual C++ 中链接到旧的第三方 DLL

一些资产没有加载到旧的 Rails 3-2-stable 应用程序中

UpdatePanel 异步回发后的 Javascript 事件订阅

在异步回发的更新面板中禁用按钮

从更新面板异步回发后保持滚动位置

有没有办法为某些异步回发禁用 UpdateProgress?