【发布时间】:2014-08-14 17:16:13
【问题描述】:
我正在尝试在使用 AJAX 控制工具包的网站上操作 .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 库发出 POST 请求的,因为我不想再使问题复杂化或疏远任何人不懂Java但懂ASP。我想知道是否有我没有解决的 ASP 问题,但我可以发布 Java 代码是必要的。
编辑:
我在发送请求之前检查了 HttpClient 正在输出的调试信息,并且表单数据被正确添加为多部分表单数据。标题也都在那里。
【问题讨论】:
-
使用 Fiddler(甚至 Wireshark)之类的工具来捕获浏览器与您的应用程序发送的请求,然后使用 diff 工具进行比较。
标签: asp.net ajaxcontroltoolkit