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

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

欢迎使用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按钮的提交数据

 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}

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

  1. 使用C#模拟ASP.NET页面中按钮点击

    c# 模拟Asp.net页面中的某个按钮的点击,向web服务器发出请求 主要就组织要提交的数据,然后以post方式提交. 假设我们有如下的网页 1 <% @ Page Language = &q ...

  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. window.history,页面中的返回按钮

    一.页面中的返回按钮事件 window.history可以不加window这个前缀 他的方法有: window.history.go(-1); //-n表示后退n页,n表示前进n页,或者是一个url ...

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

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

  6. runtime统计页面数据或者统计按钮的点击次数

    一.按钮的点击统计 有的时候我们遇见这样的需求,让我们统计用户点击我们页面的动作的次数给与用户以统计,供以后给客户端推送不同的页面数据,这时候我们就会用到iOS的黑魔法(runtime). 首先我们不 ...

  7. Android处理ListView中的Item中的Button按钮不能点击的问题

    问题描述:ListView列表中的Button按钮按钮不能点击 解决办法:在ListView中的Item项的布局文件中加上:android:descendantFocusability="b ...

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

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

  9. asp.net页面中的Console.WriteLine结果如何查看

    其实用Console.WriteLine("xxxxx"),在asp.net Web程序,在输出窗口是不会输出结果的,应该用Debug.WriteLine("xxxxx& ...

随机推荐

  1. Java Bean Validation 最佳实践

    参数校验是我们程序开发中必不可少的过程.用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需要对数据进行校验.后端参数校验最简单的 ...

  2. python utf-8 配置

    环境:centos6.5,python 2.6 源码文档使用utf-8 #!/usr/bin/python # -*- coding: UTF-8 -*- 字符串默认用utf-8(不用在前面加u了) ...

  3. html5的新特性——拖放API

    在HTML5之前只能使用鼠标事件模拟出"拖放"效果:HTML5专门为拖放提供了7个事件句柄.  被拖动的源对象可以触发的事件: (1)ondragstart:源对象开始被拖动 (2 ...

  4. java模式-工厂模式

    今天在学习工厂模式,从最简单的简单工厂模式开始. 我们现在需要通过工厂Factory生产A,B两款产品(都是产品,实现了接口Product). 产品A: public class A implemen ...

  5. 删除github仓库中的某个文件夹

    最近在做一个项目,由于前期文件夹名是中文,如下:    |---Repository       |--- React单页面音乐播放器 并且git push到了github上. 后来在本地把文件夹re ...

  6. Codeforces 722C. Destroying Array

    C. Destroying Array time limit per test 1 second memory limit per test 256 megabytes input standard ...

  7. Cocos2d-x 核心概念 - 层(Layer)

    层(Layer) 一个简单的主界面是由是三个层叠加实现的,从上到下依次为,菜单层,精灵层,背景层 这个次序适用与事件的响应机制,菜单层最先接受到系统事件,然后精灵层,最后背景层 在事件传递的过程中,如 ...

  8. linux文件权限查看及修改(实用)

    查看Linux文件的权限:ls -l 文件名称 查看linux文件夹的权限:ls -ld 文件夹名称(所在目录) 修改文件及文件夹权限: sudo chmod -(代表类型)×××(所有者)×××(组 ...

  9. Javascript 知识点整理

    1.十进制和十六进制相互转换 /* 十六进制转十进制 */ var test = FF; var x = parseInt(test ,16); //方法一 x = parseInt('0x'+tes ...

  10. 学习UFT11.5历程(二)

    1. QTP对象TO与RO TO: test object. 本地对象库里的封装对象 RO:run object. 运行封装对象 和TO.RO相关的几个函数有: GetTOProperty(“属性名” ...