zoukankan      html  css  js  c++  java
  • 使用C#模拟ASP.NET页面中按钮点击


    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页面发出请求,并得到返回数据的类


      1 using  System;
      2 using  System.Net;
      3
      4 namespace  Dlse.Com.Cn.Why
      5 {
      6 class  WebPageReader
      7 {
      8
      9 /// <summary>
    10 ///  cookie
    11 /// </summary>
    12 private  CookieCollection _Cookies  = new  CookieCollection();
    13
    14 /// <summary>
    15 ///  保持提交到同一个Session
    16 /// </summary>
    17 private  CookieContainer cookieContainer  = new  CookieContainer();
    18
    19 /// <summary>
    20 ///  保持连接
    21 /// </summary>
    22 private bool  isKeepAlive  = false ;
    23
    24 public bool  IsKeepAlive
    25 {
    26 get {  return  isKeepAlive; }
    27 set { isKeepAlive  =  value; }
    28          }
    29
    30
    31
    32 public string  GetHTML( string  URL)
    33 {
    34 return  GetHTML(URL,  "" , System.Text.Encoding.ASCII);
    35          }
    36
    37 public string  GetHTML( string  URL,  string  PostData)
    38 {
    39 return  GetHTML(URL, PostData, System.Text.Encoding.ASCII);
    40          }
    41
    42 public string  GetHTML( string  URL, System.Text.Encoding encoding)
    43 {
    44 return  GetHTML(URL, "" ,encoding );
    45          }
    46
    47 /// <summary>
    48 ///  获取指定地址的html
    49 /// </summary>
    50 /// <param name="URL"></param>
    51 /// <param name="PostData"></param>
    52 /// <param name="encoding"></param>
    53 /// <returns></returns>
    54 public string  GetHTML( string  URL,  string  PostData, System.Text.Encoding encoding)
    55 {
    56              isKeepAlive  = false ;
    57 string  _Html  = "" ;
    58
    59              HttpWebRequest request  =  (HttpWebRequest)HttpWebRequest.Create(URL);
    60              request.Accept  = " image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */* " ;
    61
    62
    63 if  (_Cookies.Count  > 0 )
    64 {
    65                  request.CookieContainer.Add( new  Uri(URL), _Cookies);
    66              }
    67 else
    68 {
    69                  request.CookieContainer  = this .cookieContainer;
    70              }
    71
    72 // 提交的数据
    73 if  (PostData  != null &&  PostData.Length  > 0 )
    74 {
    75                  request.ContentType  = " application/x-www-form-urlencoded " ;
    76                  request.Method  = " POST " ;
    77
    78 byte [] b  =  encoding.GetBytes(PostData);
    79                  request.ContentLength  =  b.Length;
    80 using  (System.IO.Stream sw  =  request.GetRequestStream())
    81 {
    82 try
    83 {
    84                          sw.Write(b,  0 , b.Length);
    85                      }
    86 catch  (Exception ex)
    87 {
    88 throw new  Exception( " Post Data Error!! " , ex);
    89                      }
    90 finally
    91 {
    92 if  (sw  != null )  { sw.Close(); }
    93                      }
    94                  }
    95              }
    96
    97
    98              HttpWebResponse response  = null ;
    99              System.IO.StreamReader sr  = null ;
    100
    101 try
    102 {
    103
    104                  response  =  (HttpWebResponse)request.GetResponse();
    105
    106                  _Cookies  =  response.Cookies;
    107
    108                  sr  = new  System.IO.StreamReader(response.GetResponseStream(), encoding);
    109
    110                  _Html  =  sr.ReadToEnd();
    111
    112              }
    113 catch  (WebException webex)
    114 {
    115 if  (webex.Status  ==  WebExceptionStatus.KeepAliveFailure)
    116 {
    117                      isKeepAlive  = true ;
    118                  }
    119 else
    120 {
    121 throw new  Exception( " DownLoad Data Error " , webex);
    122                  }
    123              }
    124 catch  (System.Exception ex)
    125 {
    126 throw new  Exception( " DownLoad Data Error " , ex);
    127              }
    128 finally
    129 {
    130 if  (sr  != null )  { sr.Close(); }
    131 if  (response  != null )  { response.Close(); }
    132                  response  = null ;
    133                  request  = null ;
    134              }
    135
    136 return  _Html;
    137
    138          }
    139      }
    140 }
    141

    使用方法如下


    1 private  WebPageReader webReader = new  WebPageReader();
    2
    3 string  __VIEWSTATE  = " /wEPDwUKMTg4ODA4NDE0NmRk6Ma0MaCJKrrNLGLfO4qYNezoxY4= " ;
    4 string  __EVENTVALIDATION  = "/wEWBQKcopufDgLEhISFCwKd+7qdDgLynailDAKT+PmaCJleqITXMfQuE9LK49YoxHV2oTzQ " ;
    5
    6 __VIEWSTATE  =  System.Web.HttpUtility.UrlEncode(__VIEWSTATE);
    7
    8 __EVENTVALIDATION  =  System.Web.HttpUtility.UrlEncode(__EVENTVALIDATION);
    9
    10 string  strPostData  =  String.Format( " __VIEWSTATE={0}&txtName={1}&txtPwd={2}&btnUpdate=Longon&__EVENTVALIDATION={3} "
    11                              , __VIEWSTATE,  this .txtName.Text,  this .txtPassword.Text, __EVENTVALIDATION
    12                              );
    13 string  strHTML;
    14
    15 try
    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 }
    25 catch  (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 }

  • 相关阅读:
    Linux CPU监控指标
    Elasticsearch强大的聚合功能Facet
    业务逻辑层的设计
    数据结构中的棧在C#中的实现
    使用WPF教你一步一步实现连连看
    ASP.NET之旅—再一次与ASP谋面
    每日一帖示例程序(使用TWebBrowser基于HTML做)
    在程序异常中记录堆栈信息(使用ExWatcher)
    获取TBitMap图像缓冲区,提高图像处理速度
    delphi实现穿XP防火墙
  • 原文地址:https://www.cnblogs.com/sennly/p/4178590.html
Copyright © 2011-2022 走看看