zoukankan      html  css  js  c++  java
  • [转] c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求

    在没有做题目中所述的内容的时候,感觉这应该是很简单的东西,但是当真正开始做的时候却发现,有很多问题
    现在在这里写出来,供和我一样水平不高的参考一下。

    在写本文之前参照了一下文章

    欢迎使用CSDN论坛阅读器 : CSDN Reader(附全部源代码) 最新版本:20070212 
    http://www.cnblogs.com/feiyun0112/archive/2006/09/20/509783.html

    C#通过webRequest保持在同一Session中Post数据 http://blog.csdn.net/crabo/archive/2005/12/08/547092.aspx

    c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求
    主要就组织要提交的数据,然后以post方式提交。

    假设我们有如下的网页


     1<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>
     2
     3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     4
     5<html xmlns="http://www.w3.org/1999/xhtml" >
     6<head runat="server">
     7    <title>无标题页</title>
     8</head>
     9<body>
    10    <form id="form1" runat="server">
    11    <div>
    12       <table>
    13       <tr>
    14        <td> 姓名:</td><td><asp:TextBox ID="txtName" runat="server"></asp:TextBox></td>
    15       </tr>
    16              <tr>
    17        <td> 昵称:</td><td><asp:TextBox ID="txtPwd" runat="server" TextMode="Password" Width="149px"></asp:TextBox></td>
    18       </tr>
    19       </table>
    20        <asp:Button ID="btnUpdate" runat="server" Text="Longon" OnClick="btnUpdate_Click" Width="60px" />
    21        <asp:Button ID="btnClose" runat="server" OnClick="btnClose_Click" Text="Close" /><br />
    22    
    23    </div>
    24    </form>
    25</body>
    26</html>

    用IE访问这个页面的时候可以得到如下的输出


     1
     2
     3<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     4
     5<html xmlns="http://www.w3.org/1999/xhtml" >
     6<head><title>
     7    无标题页
     8</title></head>
     9<body>
    10    <form name="form1" method="post" action="Default.aspx" id="form1">
    11<div>
    12<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTg4ODA4NDE0NmRk6Ma0MaCJKrrNLGLfO4qYNezoxY4=" />
    13</div>
    14
    15    <div>
    16       <table>
    17       <tr>
    18        <td> 姓名:</td><td><input name="txtName" type="text" id="txtName" /></td>
    19       </tr>
    20              <tr>
    21        <td> 昵称:</td><td><input name="txtPwd" type="password" id="txtPwd" style="149px;" /></td>
    22       </tr>
    23       </table>
    24        <input type="submit" name="btnUpdate" value="Logon" id="btnUpdate" style="60px;" />
    25        <input type="submit" name="btnClose" value="Close" id="btnClose" /><br />
    26    
    27    </div>
    28    
    29<div>
    30
    31    <input type="hidden" name="__EVENTVALIDATION" id="__EVENTVALIDATION" value="/wEWBQKcopufDgLEhISFCwKd+7qdDgLynailDAKT+PmaCJleqITXMfQuE9LK49YoxHV2oTzQ" />
    32</div></form>
    33</body>
    34</html>
    35


    由上面的代码可以看出除了txtName,txtPwd以及两个按钮外,多出了两个__VIEWSTATE,__EVENTVALIDATION这四个表单需要提交到的,要模拟哪个按钮,在加上哪个按钮的表单的值就可以了,如:btnUpdate=Logon

    在拼接提交的字符串的时候注意一下,用System.Web.HttpUtility.UrlEncode方法转换成Url编码的字符串。
    下面是针对这个页面的btnUpdate按钮的提交数据

     1 string __VIEWSTATE = "/wEPDwUKMTg4ODA4NDE0NmRk6Ma0MaCJKrrNLGLfO4qYNezoxY4=";
     2 string __EVENTVALIDATION = "/wEWBQKcopufDgLEhISFCwKd+7qdDgLynailDAKT+PmaCJleqITXMfQuE9LK49YoxHV2oTzQ";
     3 
     4 __VIEWSTATE = System.Web.HttpUtility.UrlEncode(__VIEWSTATE);
     5 
     6 __EVENTVALIDATION = System.Web.HttpUtility.UrlEncode(__EVENTVALIDATION);
     7 
     8 string strPostData = String.Format("__VIEWSTATE={0}&txtName={1}&txtPwd={2}&btnUpdate=Longon&__EVENTVALIDATION={3}"
     9                             , __VIEWSTATE, this.txtName.Text, this.txtPassword.Text, __EVENTVALIDATION
    10                             );


    然后创建一个HttpWebRequest对象,设置提交方式是post,然后把上面准备的字符串写进请求数据流里
    基本上就可以了
    如果有需要在访问不同页面时保存Session的话,需要设置HttpWebRequest对象的CookieContainer属性,保证每次设置的CookieContainer都是同一个对象就可以了。
    下面是这个类就是向WEB页面发出请求,并得到返回数据的类

    读取网页内容


    使用方法如下


     1private WebPageReader webReader = new WebPageReader();
     2
     3string __VIEWSTATE = "/wEPDwUKMTg4ODA4NDE0NmRk6Ma0MaCJKrrNLGLfO4qYNezoxY4=";
     4string __EVENTVALIDATION = "/wEWBQKcopufDgLEhISFCwKd+7qdDgLynailDAKT+PmaCJleqITXMfQuE9LK49YoxHV2oTzQ";
     5
     6__VIEWSTATE = System.Web.HttpUtility.UrlEncode(__VIEWSTATE);
     7
     8__EVENTVALIDATION = System.Web.HttpUtility.UrlEncode(__EVENTVALIDATION);
     9
    10string strPostData = String.Format("__VIEWSTATE={0}&txtName={1}&txtPwd={2}&btnUpdate=Longon&__EVENTVALIDATION={3}"
    11                            , __VIEWSTATE, this.txtName.Text, this.txtPassword.Text, __EVENTVALIDATION
    12                            );
    13string strHTML;
    14
    15try
    16{
    17    do
    18    {
    19        strHTML = webReader.GetHTML("http://localhost:3517/WebSite1/Default.aspx", strPostData);
    20    } while (webReader.IsKeepAlive);
    21
    22
    23    this.richTextBox1.Text = strHTML;
    24}
    25catch (Exception ex)
    26{
    27    if (ex.InnerException != null)
    28    {
    29        MessageBox.Show(ex.Message + "/n" + ex.InnerException.Message);
    30    }
    31    else
    32    {
    33        MessageBox.Show(ex.Message);
    34    }
    35}
  • 相关阅读:
    python之路day10命名空间和作用域、函数嵌套,作用域链、闭包
    20200719 千锤百炼软工人第十四天
    20200720 千锤百炼软工人第十五 天
    JavaScript中基本数据类型和引用数据类型的区别
    js 经纬度坐标格式化 度分秒转度 度转度分秒
    export ,export default 和 import 区别 以及用法
    10月28日学习日志
    10月20日学习日志
    10月29日学习日志
    10月27日学习日志
  • 原文地址:https://www.cnblogs.com/whtydn/p/5661255.html
Copyright © 2011-2022 走看看