[转] 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="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按钮的提交数据
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
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, __EVENTVALIDATION12
);13
string strHTML;14

15
try16
{17
do18
{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
else32
{33
MessageBox.Show(ex.Message);34
}35
}[转] c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求的更多相关文章
- 使用C#模拟ASP.NET页面中按钮点击
c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求 主要就组织要提交的数据,然后以post方式提交. 假设我们有如下的网页 1 <% @ Page Language = &q ...
- ASP.NET页面中去除VIEWSTATE视图状态乱码
保存页的所有视图状态信息和控件状态信息. 基于SEO技术的开发,在没有接触MVC框架 Razor 引擎的时候,我们需要使用ASP.NET引擎,如果使用ASP.NET引擎的服务器端控件,那么在ASP.N ...
- ASP.NET页面中去除VIEWSTATE视
保存页的所有视图状态信息和控件状态信息. 源码:http://www.jinhusns.com/Products/Download/?type=xcj 作者在早期参与的项目中曾遇到这样的需求:基于SE ...
- window.history,页面中的返回按钮
一.页面中的返回按钮事件 window.history可以不加window这个前缀 他的方法有: window.history.go(-1); //-n表示后退n页,n表示前进n页,或者是一个url ...
- Asp.net页面中调用soapheader进行验证的操作步骤
Asp.net页面中调用以SOAP头作验证的web services操作步骤 第一步:用来作SOAP验证的类必须从SoapHeader类派生,类中Public的属性将出现在自动产生XML节点中,即: ...
- runtime统计页面数据或者统计按钮的点击次数
一.按钮的点击统计 有的时候我们遇见这样的需求,让我们统计用户点击我们页面的动作的次数给与用户以统计,供以后给客户端推送不同的页面数据,这时候我们就会用到iOS的黑魔法(runtime). 首先我们不 ...
- Android处理ListView中的Item中的Button按钮不能点击的问题
问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...
- 如何在ASP.NET页面中使用异步任务(PageAsyncTask)
在页面加载期间,可能有些操作是要比较耗用时间的(例如调用外部资源,要长时间等待其返回),正常情况下,这个操作将一直占用线程.而大家知道,ASP.NET在服务端线程池中的线程数是有限的,如果一直占用的话 ...
- asp.net页面中的Console.WriteLine结果如何查看
其实用Console.WriteLine("xxxxx"),在asp.net Web程序,在输出窗口是不会输出结果的,应该用Debug.WriteLine("xxxxx& ...
随机推荐
- jquery常用总结
1.遍历对象 n是属性 value是对应的值 $.each(param,function(n,value) { datas[n] = value; }); 2.获取select改变后的值 $('sel ...
- HAProxy配置SSL
前沿 据悉苹果强制APP在2016年底使用ATS协议,所以公司准备将部分站点http统一替换成https.所有我们就得测试下 1.首先原有的haproxy1.5升级到了1.7版本支持ssl 2.查看相 ...
- Hibernate之环境搭建及demo
ORM概念 ORM即Object/Relation Mapping, 对象/关系数据库映射.ORM是一种规范,完成面向对象编程语言到关系数据库之间的映射.J2EE中的JPA就是一种ORM规范. ORM ...
- libevent源码分析:signal-test例子
signal-test是libevent自带的一个例子,展示了libevent对于信号事件的处理方法. #include <sys/types.h> #include <event2 ...
- 【转】封装Lua for C#
原文:http://blog.csdn.net/rcfalcon/article/details/5583095 为了搞懂LUA在我们的GDEX中到底怎么用,我决定研究一下如何比较好的在WPF里封装一 ...
- 理清C++常量指针和指针常量这团乱麻
写在前面: 与其说C++中的常量指针和指针常量是一块很有嚼头的语法糖,不如说它是一块相当难啃的骨头.其实本来没什么,这无非是const int *p与int* const p的区别, 但一涉及到起名字 ...
- MySQL初始配置
mysql初始密码在/var/log/mysqld.log中 ,搜索:temporary password #mysql -uroot -p 登录mysql MYSQL密码策略有3级(0,1,2)默认 ...
- contos7 安装netcore 和vscode
安装netcore 参考 http://www.cnblogs.com/hohoa/p/5691071.html 1 在root下新建一个文件夹"dotnet"用来放SDK,然后用 ...
- Latex引用插图格式制定问题(1)
自定义新命令\reffig如下:\newcommand{\reffig}[1]{Figure \ref{#1}}在需要引用图片的时候,用\reffig代替\ref,就可以自动在图号前面输出" ...
- k近邻
k近邻(k-NearestNeighbor)算法简称kNN.基本思想简单直接,对于一个需要分类的数据实例x,计算x与所有已知类别的样本点在特征空间中的距离.取与x距离最近的k个样本点,统计这些样本点所 ...