使用C#模拟ASP.NET页面中按钮点击
c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求    
主要就组织要提交的数据,然后以post方式提交。    
假设我们有如下的网页
 
    
 1  <% @ Page Language = " C# "  AutoEventWireup = " true "   CodeFile = " Default.aspx.cs "  Inherits = " _Default" %>
 <% @ 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" >
 <! 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" >
 < html  xmlns ="http://www.w3.org/1999/xhtml" >    
 6  < head  runat ="server" >
 < head  runat ="server" >    
 7  < title > 无标题页 </ title >
 < title > 无标题页 </ title >    
 8  </ head >
 </ head >    
 9  < body >
 < body >    
10  < form  id ="form1"  runat ="server" >
 < form  id ="form1"  runat ="server" >    
11  < div >
 < div >    
12  < table >
 < table >    
13  < tr >
 < tr >    
14  < td >  姓名: </ td >< td >< asp:TextBox  ID ="txtName"  runat ="server" ></ asp:TextBox ></ td >
 < td >  姓名: </ td >< td >< asp:TextBox  ID ="txtName"  runat ="server" ></ asp:TextBox ></ td >    
15  </ tr >
 </ tr >    
16  < tr >
 < tr >    
17  < td >  昵称: </ td >< td >< asp:TextBox  ID ="txtPwd"  runat ="server"  TextMode ="Password"  Width="149px" ></ asp:TextBox ></ td >
 < td >  昵称: </ td >< td >< asp:TextBox  ID ="txtPwd"  runat ="server"  TextMode ="Password"  Width="149px" ></ asp:TextBox ></ td >    
18  </ tr >
 </ tr >    
19  </ table >
 </ table >    
20  < asp:Button  ID ="btnUpdate"  runat ="server"  Text ="Longon"  OnClick ="btnUpdate_Click"  Width="60px" />
 < 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  />
 < asp:Button  ID ="btnClose"  runat ="server"  OnClick ="btnClose_Click"  Text ="Close" />< br  />    
22  
    
23  </ div >
 </ div >    
24  </ form >
 </ form >    
25  </ body >
 </ body >    
26  </ html >
 </ 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" >
 <! 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" >
 < html  xmlns ="http://www.w3.org/1999/xhtml" >    
 6  < head >< title >
 < head >< title >    
 7  无标题页
     无标题页    
 8  </ title ></ head >
 </ title ></ head >    
 9  < body >
 < body >    
10  < form  name ="form1"  method ="post"  action ="Default.aspx"  id ="form1" >
 < form  name ="form1"  method ="post"  action ="Default.aspx"  id ="form1" >    
11  < div >
 < div >    
12  < input  type ="hidden"  name ="__VIEWSTATE"  id ="__VIEWSTATE"  value="/wEPDwUKMTg4ODA4NDE0NmRk6Ma0MaCJKrrNLGLfO4qYNezoxY4=" />
 < input  type ="hidden"  name ="__VIEWSTATE"  id ="__VIEWSTATE"  value="/wEPDwUKMTg4ODA4NDE0NmRk6Ma0MaCJKrrNLGLfO4qYNezoxY4=" />    
13  </ div >
 </ div >    
14  
    
15  < div >
 < div >    
16  < table >
 < table >    
17  < tr >
 < tr >    
18  < td >  姓名: </ td >< td >< input  name ="txtName"  type ="text"  id ="txtName" /></ td >
 < td >  姓名: </ td >< td >< input  name ="txtName"  type ="text"  id ="txtName" /></ td >    
19  </ tr >
 </ tr >    
20  < tr >
 < tr >    
21  < td >  昵称: </ td >< td >< input  name ="txtPwd"  type ="password"  id ="txtPwd"  style ="width:149px;" /></ td >
 < td >  昵称: </ td >< td >< input  name ="txtPwd"  type ="password"  id ="txtPwd"  style ="width:149px;" /></ td >    
22  </ tr >
 </ tr >    
23  </ table >
 </ table >    
24  < input  type ="submit"  name ="btnUpdate"  value ="Logon"  id ="btnUpdate"  style ="width:60px;" />
 < input  type ="submit"  name ="btnUpdate"  value ="Logon"  id ="btnUpdate"  style ="width:60px;" />    
25  < input  type ="submit"  name ="btnClose"  value ="Close"  id ="btnClose" />< br  />
 < input  type ="submit"  name ="btnClose"  value ="Close"  id ="btnClose" />< br  />    
26  
    
27  </ div >
 </ div >    
28  
    
29  < div >
 < div >    
30  
    
31  < input  type ="hidden"  name ="__EVENTVALIDATION"  id ="__EVENTVALIDATION"  value="/wEWBQKcopufDgLEhISFCwKd+7qdDgLynailDAKT+PmaCJleqITXMfQuE9LK49YoxHV2oTzQ" />
 < input  type ="hidden"  name ="__EVENTVALIDATION"  id ="__EVENTVALIDATION"  value="/wEWBQKcopufDgLEhISFCwKd+7qdDgLynailDAKT+PmaCJleqITXMfQuE9LK49YoxHV2oTzQ" />    
32  </ div ></ form >
 </ div ></ form >    
33  </ body >
 </ body >    
34  </ html >
 </ 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;
 using  System;    
  2  using  System.Net;
 using  System.Net;    
  3  
    
  4  namespace  Dlse.Com.Cn.Why
 namespace  Dlse.Com.Cn.Why    
  5  {
 {    
  6  class  WebPageReader
 class  WebPageReader    
  7  {
 {    
  8  
    
  9  /// <summary>
 /// <summary>    
 10  ///  cookie
 ///  cookie    
 11  /// </summary>
 /// </summary>    
 12  private  CookieCollection _Cookies  = new  CookieCollection();
 private  CookieCollection _Cookies  = new  CookieCollection();    
 13  
    
 14  /// <summary>
 /// <summary>    
 15  ///  保持提交到同一个Session
 ///  保持提交到同一个Session    
 16  /// </summary>
 /// </summary>    
 17  private  CookieContainer cookieContainer  = new  CookieContainer();
 private  CookieContainer cookieContainer  = new  CookieContainer();    
 18  
    
 19  /// <summary>
 /// <summary>    
 20  ///  保持连接
 ///  保持连接    
 21  /// </summary>
 /// </summary>    
 22  private bool  isKeepAlive  = false ;
 private bool  isKeepAlive  = false ;    
 23  
    
 24  public bool  IsKeepAlive
 public bool  IsKeepAlive    
 25  {
 {    
 26  get {  return  isKeepAlive; }
 get {  return  isKeepAlive; }    
 27  set { isKeepAlive  =  value; }
 set { isKeepAlive  =  value; }    
 28  }
         }    
 29  
    
 30  
    
 31  
    
 32  public string  GetHTML( string  URL)
 public string  GetHTML( string  URL)    
 33  {
 {    
 34  return  GetHTML(URL,  "" , System.Text.Encoding.ASCII);
 return  GetHTML(URL,  "" , System.Text.Encoding.ASCII);    
 35  }
         }    
 36  
    
 37  public string  GetHTML( string  URL,  string  PostData)
 public string  GetHTML( string  URL,  string  PostData)    
 38  {
 {    
 39  return  GetHTML(URL, PostData, System.Text.Encoding.ASCII);
 return  GetHTML(URL, PostData, System.Text.Encoding.ASCII);    
 40  }
         }    
 41  
    
 42  public string  GetHTML( string  URL, System.Text.Encoding encoding)
 public string  GetHTML( string  URL, System.Text.Encoding encoding)    
 43  {
 {    
 44  return  GetHTML(URL, "" ,encoding );
 return  GetHTML(URL, "" ,encoding );    
 45  }
         }    
 46  
    
 47  /// <summary>
 /// <summary>    
 48  ///  获取指定地址的html
 ///  获取指定地址的html    
 49  /// </summary>
 /// </summary>    
 50  /// <param name="URL"></param>
 /// <param name="URL"></param>    
 51  /// <param name="PostData"></param>
 /// <param name="PostData"></param>    
 52  /// <param name="encoding"></param>
 /// <param name="encoding"></param>    
 53  /// <returns></returns>
 /// <returns></returns>    
 54  public string  GetHTML( string  URL,  string  PostData, System.Text.Encoding encoding)
 public string  GetHTML( string  URL,  string  PostData, System.Text.Encoding encoding)    
 55  {
 {    
 56  isKeepAlive  = false ;
             isKeepAlive  = false ;    
 57  string  _Html  = "" ;
 string  _Html  = "" ;    
 58  
    
 59  HttpWebRequest request  =  (HttpWebRequest)HttpWebRequest.Create(URL);
             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, */* " ;
             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 )
 if  (_Cookies.Count  > 0 )    
 64  {
 {    
 65  request.CookieContainer.Add( new  Uri(URL), _Cookies);
                 request.CookieContainer.Add( new  Uri(URL), _Cookies);    
 66  }
             }    
 67  else
 else    
 68  {
 {    
 69  request.CookieContainer  = this .cookieContainer;
                 request.CookieContainer  = this .cookieContainer;    
 70  }
             }    
 71  
    
 72  // 提交的数据
 // 提交的数据    
 73  if  (PostData  != null &&  PostData.Length  > 0 )
 if  (PostData  != null &&  PostData.Length  > 0 )    
 74  {
 {    
 75  request.ContentType  = " application/x-www-form-urlencoded " ;
                 request.ContentType  = " application/x-www-form-urlencoded " ;    
 76  request.Method  = " POST " ;
                 request.Method  = " POST " ;    
 77  
    
 78  byte [] b  =  encoding.GetBytes(PostData);
 byte [] b  =  encoding.GetBytes(PostData);    
 79  request.ContentLength  =  b.Length;
                 request.ContentLength  =  b.Length;    
 80  using  (System.IO.Stream sw  =  request.GetRequestStream())
 using  (System.IO.Stream sw  =  request.GetRequestStream())    
 81  {
 {    
 82  try
 try    
 83  {
 {    
 84  sw.Write(b,  0 , b.Length);
                         sw.Write(b,  0 , b.Length);    
 85  }
                     }    
 86  catch  (Exception ex)
 catch  (Exception ex)    
 87  {
 {    
 88  throw new  Exception( " Post Data Error!! " , ex);
 throw new  Exception( " Post Data Error!! " , ex);    
 89  }
                     }    
 90  finally
 finally    
 91  {
 {    
 92  if  (sw  != null )  { sw.Close(); }
 if  (sw  != null )  { sw.Close(); }    
 93  }
                     }    
 94  }
                 }    
 95  }
             }    
 96  
    
 97  
    
 98  HttpWebResponse response  = null ;
             HttpWebResponse response  = null ;    
 99  System.IO.StreamReader sr  = null ;
             System.IO.StreamReader sr  = null ;    
100  
    
101  try
 try    
102  {
 {    
103  
    
104  response  =  (HttpWebResponse)request.GetResponse();
                 response  =  (HttpWebResponse)request.GetResponse();    
105  
    
106  _Cookies  =  response.Cookies;
                 _Cookies  =  response.Cookies;    
107  
    
108  sr  = new  System.IO.StreamReader(response.GetResponseStream(), encoding);
                 sr  = new  System.IO.StreamReader(response.GetResponseStream(), encoding);    
109  
    
110  _Html  =  sr.ReadToEnd();
                 _Html  =  sr.ReadToEnd();    
111  
    
112  }
             }    
113  catch  (WebException webex)
 catch  (WebException webex)    
114  {
 {    
115  if  (webex.Status  ==  WebExceptionStatus.KeepAliveFailure)
 if  (webex.Status  ==  WebExceptionStatus.KeepAliveFailure)    
116  {
 {    
117  isKeepAlive  = true ;
                     isKeepAlive  = true ;    
118  }
                 }    
119  else
 else    
120  {
 {    
121  throw new  Exception( " DownLoad Data Error " , webex);
 throw new  Exception( " DownLoad Data Error " , webex);    
122  }
                 }    
123  }
             }    
124  catch  (System.Exception ex)
 catch  (System.Exception ex)    
125  {
 {    
126  throw new  Exception( " DownLoad Data Error " , ex);
 throw new  Exception( " DownLoad Data Error " , ex);    
127  }
             }    
128  finally
 finally    
129  {
 {    
130  if  (sr  != null )  { sr.Close(); }
 if  (sr  != null )  { sr.Close(); }    
131  if  (response  != null )  { response.Close(); }
 if  (response  != null )  { response.Close(); }    
132  response  = null ;
                 response  = null ;    
133  request  = null ;
                 request  = null ;    
134  }
             }    
135  
    
136  return  _Html;
 return  _Html;    
137  
    
138  }
         }    
139  }
     }    
140  }
 }    
141 
使用方法如下
 
    
 1  private  WebPageReader webReader = new  WebPageReader();
 private  WebPageReader webReader = new  WebPageReader();    
 2  
    
 3  string  __VIEWSTATE  = " /wEPDwUKMTg4ODA4NDE0NmRk6Ma0MaCJKrrNLGLfO4qYNezoxY4= " ;
 string  __VIEWSTATE  = " /wEPDwUKMTg4ODA4NDE0NmRk6Ma0MaCJKrrNLGLfO4qYNezoxY4= " ;    
 4  string  __EVENTVALIDATION  = "/wEWBQKcopufDgLEhISFCwKd+7qdDgLynailDAKT+PmaCJleqITXMfQuE9LK49YoxHV2oTzQ " ;
 string  __EVENTVALIDATION  = "/wEWBQKcopufDgLEhISFCwKd+7qdDgLynailDAKT+PmaCJleqITXMfQuE9LK49YoxHV2oTzQ " ;    
 5  
    
 6  __VIEWSTATE  =  System.Web.HttpUtility.UrlEncode(__VIEWSTATE);
 __VIEWSTATE  =  System.Web.HttpUtility.UrlEncode(__VIEWSTATE);    
 7  
    
 8  __EVENTVALIDATION  =  System.Web.HttpUtility.UrlEncode(__EVENTVALIDATION);
 __EVENTVALIDATION  =  System.Web.HttpUtility.UrlEncode(__EVENTVALIDATION);    
 9  
    
10  string  strPostData  =  String.Format( " __VIEWSTATE={0}&txtName={1}&txtPwd={2}&btnUpdate=Longon&__EVENTVALIDATION={3} "
 string  strPostData  =  String.Format( " __VIEWSTATE={0}&txtName={1}&txtPwd={2}&btnUpdate=Longon&__EVENTVALIDATION={3} "    
11  , __VIEWSTATE,  this .txtName.Text,  this .txtPassword.Text, __EVENTVALIDATION
                             , __VIEWSTATE,  this .txtName.Text,  this .txtPassword.Text, __EVENTVALIDATION    
12  );
                             );    
13  string  strHTML;
 string  strHTML;    
14  
    
15  try
 try    
16  {
 {    
17  do
 do    
18  {
 {    
19  strHTML  =  webReader.GetHTML( " http://localhost:3517/WebSite1/Default.aspx " , strPostData);
         strHTML  =  webReader.GetHTML( " http://localhost:3517/WebSite1/Default.aspx " , strPostData);    
20  } while  (webReader.IsKeepAlive);
     } while  (webReader.IsKeepAlive);    
21  
    
22  
    
23  this .richTextBox1.Text  =  strHTML;
 this .richTextBox1.Text  =  strHTML;    
24  }
 }    
25  catch  (Exception ex)
 catch  (Exception ex)    
26  {
 {    
27  if  (ex.InnerException  != null )
 if  (ex.InnerException  != null )    
28  {
 {    
29  MessageBox.Show(ex.Message  + " /n " +  ex.InnerException.Message);
         MessageBox.Show(ex.Message  + " /n " +  ex.InnerException.Message);    
30  }
     }    
31  else
 else    
32  {
 {    
33  MessageBox.Show(ex.Message);
         MessageBox.Show(ex.Message);    
34  }
     }    
35  }
 }
使用C#模拟ASP.NET页面中按钮点击的更多相关文章
- [转] c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求
		在没有做题目中所述的内容的时候,感觉这应该是很简单的东西,但是当真正开始做的时候却发现,有很多问题现在在这里写出来,供和我一样水平不高的参考一下. 在写本文之前参照了一下文章 欢迎使用CSDN论坛阅读 ... 
- ASP.NET页面中去除VIEWSTATE视图状态乱码
		保存页的所有视图状态信息和控件状态信息. 基于SEO技术的开发,在没有接触MVC框架 Razor 引擎的时候,我们需要使用ASP.NET引擎,如果使用ASP.NET引擎的服务器端控件,那么在ASP.N ... 
- ASP.NET页面中去除VIEWSTATE视
		保存页的所有视图状态信息和控件状态信息. 源码:http://www.jinhusns.com/Products/Download/?type=xcj 作者在早期参与的项目中曾遇到这样的需求:基于SE ... 
- Asp.net页面中调用soapheader进行验证的操作步骤
		Asp.net页面中调用以SOAP头作验证的web services操作步骤 第一步:用来作SOAP验证的类必须从SoapHeader类派生,类中Public的属性将出现在自动产生XML节点中,即: ... 
- Vue 动态控制页面中按钮是否显示和样式
		<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ... 
- vue基于页面中按钮权限控制
		main.js // 权限 /** 权限指令,对按钮权限的控制 **/ Vue.directive('allow', { bind: function(el, binding) { // 通过当前按钮 ... 
- asp.net 页面上的点击事件
		asp.net 页面上 服务器端控件Button 有两个click事件如 <asp:Button ID="Button1" runat="server" ... 
- iOS中按钮点击事件处理方式
		写在前面 在iOS开发中,时常会用到按钮,通过按钮的点击来完成界面的跳转等功能.按钮事件的实现方式有多种,其中 较为常用的是目标-动作对模式.但这种方式使得view与controller之间的耦合程度 ... 
- 如何在ASP.NET页面中使用异步任务(PageAsyncTask)
		在页面加载期间,可能有些操作是要比较耗用时间的(例如调用外部资源,要长时间等待其返回),正常情况下,这个操作将一直占用线程.而大家知道,ASP.NET在服务端线程池中的线程数是有限的,如果一直占用的话 ... 
随机推荐
- cms开发笔记2
			1 创建数据库表 //配置文件CREATE TABLE IF NOT EXISTS `mc_config` ( `en_name` varchar(80) NOT NULL, `ch_name` va ... 
- Reactor模式(反应器模式)
			Reactor这个词译成汉语还真没有什么合适的,很多地方叫反应器模式,但更多好像就直接叫reactor模式了,其实我觉着叫应答者模式更好理解一些.通过了解,这个模式更像一个侍卫,一直在等待你的召唤,或 ... 
- DB2实用命令记录
			quiesce tablespace quiesce tablespaces for table <table_name> share; Monitor Switches details ... 
- uCGUI字符串显示过程分析和uCGUI字库的组建
			为什么要分析字符串的显示过程? 学习uCGUI主要是学习如何使用的,为何要深究到源码的层次呢? 就分析字符串显示过程的原因来说,是因为移植汉字字库的需要.uCGUI并么有合适的汉字字库,而且完整的汉字 ... 
- to config RBS/RBLOB in sharepoint
			http://technet.microsoft.com/en-us/library/gg316768(v=sql.105).aspx http://technet.microsoft.com/en- ... 
- [JavaScript] js获取Html元素的实际宽度高度
			第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通 过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度. ... 
- 为sublime text2 添加SASS语法高亮
			以前写CSS时,都是直接写样式,没有任何的第三方工具,后面发现越是面向大网站,越难管理,上次参加完携程UED大会后,发现SASS对于前端团队多人协作和站点代码维护上很有帮助,很多同学都开始用了,我还是 ... 
- treeview 点击时选中节点
			private void tv_WebList_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) { Point clickPo ... 
- SDUT 1570 C 旅行(DFS)
			点我看题目 题意 : 中文不详述. 思路 :就是DFS一下,只要到达终点条数就加1,然后再注意一下方向,因为我就是没注意方向WA了,只能向上向右走,x是行,所以向上是x-1,向右是y+1,因为我没弄好 ... 
- DJANGO模板的BLOCK自定义技巧
			除了INCLUDE, EXTENDS基本的继承模板之外,如果想在本模板上,直接生成让同类页面继承的模板, 则可以需要自定义的地方实现自定义BLOCK, 先在本页面实现自己的BLOCK,然后,在继承的页 ... 
