【问题标题】:How to manipulate a .NET ASPX form programmatically?如何以编程方式操作 .NET ASPX 表单?
【发布时间】: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


【解决方案1】:

这个答案有点远,但我见过更奇怪的事情。

你提到了这个标题:

X-MicrosoftAjax: Delta=true

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

x-microsoftajax: Delta=true

herehere

是否可以像不正确封装标题一样简单?

【讨论】:

    【解决方案2】:

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

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

    request.setEntity(new UrlEncodedFormEntity(paramList));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-17
      • 2019-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多