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

时间:2014-08-11 21:11:57

标签: asp.net ajaxcontroltoolkit

我正在尝试在使用AJAX Control Toolkit的网站上操作.net ASP表单。该站点只能访问有效登录,并且我有一个有效的帐户。它由带有表单的搜索页面组成。每次在表单上单击提交按钮时,将使用表单上某些文本字段的值更新服务器,然后将根据服务器的响应更新VIEWSTATE和EVENTVALIDATION标记,为下一个请求做好准备。

我在Java中使用HttpClient来做到这一点。我怀疑在一般情况下与ASPX表单的交互方面我有些不正确。

当我第一次点击主搜索页面时(Cookie正在验证我在服务器上的登录信息),我收到了搜索页面的HTML。我为下一个请求提取VIEWSTATE和EVENTVALIDATION标记。我已经检查了确切的表单字段及其值,这些字段及其值需要通过在手动在站点上发出请求后查看Chrome调试器实用程序在POST中发送到服务器。我已经按照应有的方式复制了完全,适当地插入了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

我还尝试复制Chrome调试器显示的标头,因此我的请求包括相同的Content-Type,Host,Origin,Referer,User-Agent(针对我的浏览器)和其他所有标头,包括此标头X-MicrosoftAjax: Delta=true

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

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

2 个答案:

答案 0 :(得分:1)

这个答案很长,但我看到了更奇怪的事情。

你提到这个标题:

X-MicrosoftAjax: Delta=true

我做了一些深度的谷歌搜索,发现这通常在Ajax转储和UpdatePanel POST请求中显示为全部小写:

x-microsoftajax: Delta=true

请参阅herehere

是否可以像没有正确套管头一样简单?

答案 1 :(得分:1)

我最终得到了这个工作。这个问题一般不是特定于ASP,实际上是Java(特别是HttpClient)发送请求的问题。我使用HttpClient使用多部分表单编译请求,但是在使用Fiddler分析和比较我的应用程序和实际网页发送的请求(请参阅this question的编辑部分以获取更多详细信息)之后,我的应用程序请求的结构非常不同。

真正的网站请求在请求正文中嵌入了表单选项,看起来像URL编码的查询字符串。我的请求是请求正文中的一系列条目,其中每个选项都包含在Content-Type和Content-Disposition标头中。更改POST后,请求成功添加以下参数:

request.setEntity(new UrlEncodedFormEntity(paramList));