如何使用C#发布到asp.net验证所需页面并阅读响应

时间:2012-02-05 00:35:45

标签: c# asp.net post html-agility-pack

我正在编写自己的特定产品抓取工具。现在有一个产品销售网站,它使用页面的帖子数据。我真的需要能够发布数据并阅读响应。但是他们正在使用asp.net验证,它是如此混乱。我真的无法弄清楚如何正确发布数据和阅读。我正在使用htmlagilitypack。如果可以使用htmlagilitypack发布数据并阅读响应,那真的非常棒。

现在这是示例页面:http://www.hizlial.com/HizliListele.aspx?CatID=482643

当您打开页面时,请查看“urun_listele”类

你会看到那里的选项

20 Ürün Listele
40 Ürün Listele
60 Ürün Listele
Tümünü Listele

这些数字是要显示的产品数量。 Tümünü应用程序表示列出所有产品。现在我真的需要发布数据并获得该产品类别下的所有产品。我使用firebug进行调试并尝试在下面进行编码,但我仍然有默认的产品数量

        private void button11_Click(object sender, RoutedEventArgs e)
    {
        StringBuilder srBuilder = new StringBuilder();
        AppendPostParameter(srBuilder, "ctl00$ContentPlaceHolder1$cmbUrunSayi", "full");    
        srBuilder = srBuilder.Replace("&", "", srBuilder.Length - 1, 1);
        byte[] byteArray = Encoding.UTF8.GetBytes(srBuilder.ToString());
        HttpWebRequest hWebReq = (HttpWebRequest)WebRequest.Create("http://www.hizlial.com/HizliListele.aspx?CatID=482643");
        hWebReq.Method = "POST";
        hWebReq.ContentType = "application/x-www-form-urlencoded";

        using (Stream requestStream = hWebReq.GetRequestStream())
        {
            requestStream.Write(byteArray, 0, byteArray.Length);
        }
        HtmlDocument hd = new HtmlDocument();

        using (HttpWebResponse response = (HttpWebResponse)hWebReq.GetResponse())
        {
            using (StreamReader sr = new StreamReader(response.GetResponseStream()))
            {              
                var htmlstring = sr.ReadToEnd();
            }
        }
    }

    static private void AppendPostParameter(StringBuilder sb, string name, string value)
    {
        sb.AppendFormat("{0}={1}&", name, HttpUtility.UrlEncode(value));
    }

获取数据后,我将其加载到htmlagilitypack HtmlDocument

感谢任何帮助。

C#4.0,wpf application,htmlagiltiypack

1 个答案:

答案 0 :(得分:1)

ASP .Net使用__EVENTTARGET__EVENTARGUMENT字段来模拟Windows窗体行为。要在服务器上模拟组合框的更改事件,您需要附加到表单字段以请求它们__EVENTTARGET为'ctl00 $ ContentPlaceHolder1 $ cmbUrunSayi'和__EVENTARGUMENT为''。

如果你看一下combo和__doPostBack方法的更改代码,你会明白我的意思。您可以在声明srBuilder之后插入以下代码。这样代码就可以了。

AppendPostParameter(srBuilder,  "__EVENTTARGET", "ctl00$ContentPlaceHolder1$cmbUrunSayi"); 
AppendPostParameter(srBuilder, "__EVENTARGUMENT", string.Empty); 

您还需要提取__VIEWSTATE& __EVENTVALIDATION值。为了让他们只是发送一个虚拟请求,并从该请求中提取该值和cookie,然后将它们添加到新请求中...