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 ="width:149px;" /></ td >
22 </ tr >
23 </ table >
24 < input  type ="submit"  name ="btnUpdate"  value ="Logon"  id ="btnUpdate"  style ="width: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 }

使用C#模拟ASP.NET页面中按钮点击的更多相关文章

  1. [转] c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求

    在没有做题目中所述的内容的时候,感觉这应该是很简单的东西,但是当真正开始做的时候却发现,有很多问题现在在这里写出来,供和我一样水平不高的参考一下. 在写本文之前参照了一下文章 欢迎使用CSDN论坛阅读 ...

  2. ASP.NET页面中去除VIEWSTATE视图状态乱码

    保存页的所有视图状态信息和控件状态信息. 基于SEO技术的开发,在没有接触MVC框架 Razor 引擎的时候,我们需要使用ASP.NET引擎,如果使用ASP.NET引擎的服务器端控件,那么在ASP.N ...

  3. ASP.NET页面中去除VIEWSTATE视

    保存页的所有视图状态信息和控件状态信息. 源码:http://www.jinhusns.com/Products/Download/?type=xcj 作者在早期参与的项目中曾遇到这样的需求:基于SE ...

  4. Asp.net页面中调用soapheader进行验证的操作步骤

    Asp.net页面中调用以SOAP头作验证的web services操作步骤 第一步:用来作SOAP验证的类必须从SoapHeader类派生,类中Public的属性将出现在自动产生XML节点中,即: ...

  5. Vue 动态控制页面中按钮是否显示和样式

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. vue基于页面中按钮权限控制

    main.js // 权限 /** 权限指令,对按钮权限的控制 **/ Vue.directive('allow', { bind: function(el, binding) { // 通过当前按钮 ...

  7. asp.net 页面上的点击事件

    asp.net 页面上 服务器端控件Button 有两个click事件如 <asp:Button ID="Button1" runat="server" ...

  8. iOS中按钮点击事件处理方式

    写在前面 在iOS开发中,时常会用到按钮,通过按钮的点击来完成界面的跳转等功能.按钮事件的实现方式有多种,其中 较为常用的是目标-动作对模式.但这种方式使得view与controller之间的耦合程度 ...

  9. 如何在ASP.NET页面中使用异步任务(PageAsyncTask)

    在页面加载期间,可能有些操作是要比较耗用时间的(例如调用外部资源,要长时间等待其返回),正常情况下,这个操作将一直占用线程.而大家知道,ASP.NET在服务端线程池中的线程数是有限的,如果一直占用的话 ...

随机推荐

  1. (转载)ADOQuery参数传递

    ADOQuery参数传递 dbgrid1.DataSource := datasource1; datasource1.DataSet := adoquery1; Value := 1221; SQL ...

  2. 【BZOJ】1001: [BeiJing2006]狼抓兔子 Dinic算法求解平面图对偶图-最小割

    1001: [BeiJing2006]狼抓兔子 Description 左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下 三种类型的道路 1:(x,y)<==>( ...

  3. Microsoft SQL Server 2008 R2 中文安装说明

    Microsoft SQL Server 2008 基本安装说明 安装SQL2008的过程与SQL2005的程序基本一样,只不过在安装的过程中部分选项有所改变,当然如果只熟悉SQL2000安装的同志来 ...

  4. 【gitlab】版本管理工具

  5. 【Catalina】

    Tomcat's servlet container was redesigned as Catalina in Tomcat version 4.x. The architect for Catal ...

  6. HtmlTestRunner二次封装(TestRunner.py)

    将HtmlTestRunner进行二次封装,使报告生成的更方便 import HTMLTestRunner import unittest import time, os class TestRunn ...

  7. Emule使用Upnp,解决Lowid和port not reachable的问题

    路由器上钩选开启Upnp Emule->选择->扩展选项->Upnp, 服务器:[从URL更新]http://upd.emule-security.org/server.met

  8. A Neural Network in 11 lines of Python

    A Neural Network in 11 lines of Python A bare bones neural network implementation to describe the in ...

  9. XSS脚本攻击漫谈

    XSS跨站脚本攻击一直都被认为是客户端  Web安全中最主流的攻击方式.因为  Web环境的复杂性以及 XSS跨站脚本攻击的多变性,使得该类型攻击很难彻底解决.那么,XSS跨站脚本攻击具体攻击行为是什 ...

  10. throw 与 throws的应用

    throws---------->把异常交给调用处. 可以结合throw来同时使用. throws 用在方法声明处,表示本方法不处理异常.可以结合throw使用 throw 表示在方法中手工抛出 ...