Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net 如何以编程方式操作.NET ASPX表单?_Asp.net_Ajaxcontroltoolkit - Fatal编程技术网

Asp.net 如何以编程方式操作.NET ASPX表单?

Asp.net 如何以编程方式操作.NET ASPX表单?,asp.net,ajaxcontroltoolkit,Asp.net,Ajaxcontroltoolkit,我试图在使用AJAX控件工具包的站点上操作.NETASP表单。该网站只能访问有效的登录名,我有一个有效的帐户。它由一个带有表单的搜索页面组成。每次单击表单上的submit按钮时,服务器都会使用表单上某些文本字段的值进行更新,然后VIEWSTATE和EVENTVALIDATION标记将根据服务器的响应进行更新,为下一个请求做好准备 我使用Java中的HttpClient来实现这一点。我怀疑在与ASPX表单的交互方面,我做得不正确 当我第一次点击主搜索页面时(cookies正在验证我在服务器上的登录

我试图在使用AJAX控件工具包的站点上操作.NETASP表单。该网站只能访问有效的登录名,我有一个有效的帐户。它由一个带有表单的搜索页面组成。每次单击表单上的submit按钮时,服务器都会使用表单上某些文本字段的值进行更新,然后VIEWSTATE和EVENTVALIDATION标记将根据服务器的响应进行更新,为下一个请求做好准备

我使用Java中的HttpClient来实现这一点。我怀疑在与ASPX表单的交互方面,我做得不正确

当我第一次点击主搜索页面时(cookies正在验证我在服务器上的登录),我得到了搜索页面的HTML。我为下一个请求提取VIEWSTATE和EVENTVALIDATION令牌。我已经在一篇文章中检查了需要发送到服务器的确切表单字段及其值,在手动向站点发出请求后查看了Chrome调试器实用程序。我已经完全复制了它们,适当地插入了VIEWSTATE和EVENTVALIDATION

但是我从服务器上得到的响应不是它应该得到的。我得到的是与我第一次访问网页时得到的主搜索页面相同的HTML。我使用的表单数据如下所示:

ctl00$ScriptManager1:ctl00$ContentPlaceHolder1$UpdatePanel1|ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$acceptButton
ctl00_ContentPlaceHolder1_TabContainer1_ClientState:{"ActiveTabIndex":0,"TabState":[true,true]}
__EVENTTARGET:
__EVENTARGUMENT:
__LASTFOCUS:
__VIEWSTATE:<token extracted from first page hit>
__VIEWSTATEENCRYPTED:
__EVENTVALIDATION:<token extracted from first page hit>
ctl00$ContentPlaceHolder1$LabelFee:0
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$RadioButtonList1:Person
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$snameText:aSurname
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$HiddenField1:
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$fnameText:aFirstname
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$dayFromTextBox:01
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$monthFromTextBox:January
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$yearFromTextBox:2001
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$dayToTextBox:01
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$monthToTextBox:January
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$yearToTextBox:2008
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$DropDownList1:aCity
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$PropText:
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel2$RefText:
__ASYNCPOST:true
ctl00$ContentPlaceHolder1$TabContainer1$TabPanel1$acceptButton:Accept
ctl00$ScriptManager1:ctl00$ContentPlaceholder 1$UpdatePanel1 | ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$acceptButton
ctl00_内容占位符1_TabContainer1_客户端状态:{“ActiveTabIndex”:0,“TabState”:[true,true]}
__事件目标:
__事件参数:
__最后焦点:
__视图状态:
__VIEWSTATEENCRYPTED:
__事件验证:
ctl00$ContentPlaceholder 1$LabelFee:0
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$RadioButtonList1:Person
ctl00$contentplaceholder 1$TabContainer1$TabPanel1$snameText:aSurname
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$HiddenField1:
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$fnameText:AffirstName
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$dayFromTextBox:01
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$monthFromTextBox:一月
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$yearFromTextBox:2001
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$dayToTextBox:01
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$Month文本框:一月
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$yearToTextBox:2008
ctl00$contentplaceholder 1$TabContainer1$TabPanel1$DropDownList1:aCity
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$PropText:
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel2$RefText:
__ASYNCPOST:true
ctl00$ContentPlaceholder 1$TabContainer1$TabPanel1$acceptButton:接受
我还尝试复制Chrome调试器显示的标题,因此我的请求包括相同的内容类型、主机、来源、引用者、用户代理(用于我的浏览器)和每个其他标题,包括此标题
X-MicrosoftAjax:Delta=true

我知道这里有很多活动部分,但我故意没有提到我是如何使用HttpClient lib发出POST请求的,因为我不想再让问题复杂化,也不想疏远任何不懂Java但懂ASP的人。我想知道是否有一个ASP的问题,我没有解决,但我可以张贴Java代码是必要的

编辑:

我已经检查了HttpClient在发送请求之前输出的调试信息,并且表单数据被正确地添加为多部分表单数据。标题也都在那里。

这个答案不太可能,但我看到了更奇怪的事情

你提到这个标题:

X-MicrosoftAjax: Delta=true
我在谷歌上做了一些深入的搜索,发现在Ajax和
UpdatePanel
POST请求的转储中,这通常都显示为小写:

x-microsoftajax: Delta=true
见和


这会不会像不正确套入收割台那样简单

我终于让它工作了。这个问题通常不是ASP特有的,实际上是Java(特别是HttpClient)如何发送请求的问题。我使用HttpClient使用多部分表单编译请求,但在使用Fiddler分析和比较从我的应用程序和实际网页发送的请求(有关详细信息,请参阅的编辑部分)之后,我的应用程序请求的结构非常不同

真正的网站请求在请求体中嵌入了表单选项,看起来像URL编码的查询字符串。我的请求是请求主体中的一系列条目,其中每个选项都包装在内容类型和内容处置头中。更改POST以添加以下参数后,请求成功:

request.setEntity(new UrlEncodedFormEntity(paramList));
使用Fiddler(甚至Wireshark)等工具捕获浏览器发送的请求与应用程序发送的请求,然后使用diff工具进行比较。