在没有做题目中所述的内容的时候,感觉这应该是很简单的东西,但是当真正开始做的时候却发现,有很多问题
现在在这里写出来,供和我一样水平不高的参考一下。
在写本文之前参照了一下文章
欢迎使用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方式提交。
假设我们有如下的网页
Asp.net网页内容
1![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%
@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %>
2![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
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![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
2![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
4![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
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![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
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![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
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![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
4
namespace Dlse.Com.Cn.Why
5![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
6
class WebPageReader
7![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
8![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
10
/// cookie
11
/// </summary>
12
private CookieCollection _Cookies = new CookieCollection();
13![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
15
/// 保持提交到同一个Session
16
/// </summary>
17
private CookieContainer cookieContainer = new CookieContainer();
18![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
20
/// 保持连接
21
/// </summary>
22
private bool isKeepAlive = false;
23![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
public bool IsKeepAlive
25![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
26![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return isKeepAlive; }
27![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ isKeepAlive = value; }
28
}
29
30![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
public string GetHTML(string URL)
33![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
34
return GetHTML(URL, "", System.Text.Encoding.ASCII);
35
}
36![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
public string GetHTML(string URL, string PostData)
38![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
39
return GetHTML(URL, PostData, System.Text.Encoding.ASCII);
40
}
41![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
42
public string GetHTML(string URL, System.Text.Encoding encoding)
43![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
44
return GetHTML(URL,"",encoding );
45
}
46![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
47![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
56
isKeepAlive = false;
57
string _Html = "";
58![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
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![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
62![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63
if (_Cookies.Count > 0)
64![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
65
request.CookieContainer.Add(new Uri(URL), _Cookies);
66
}
67
else
68![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
69
request.CookieContainer = this.cookieContainer;
70
}
71![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
72
//提交的数据
73
if (PostData != null && PostData.Length > 0)
74![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
75
request.ContentType = "application/x-www-form-urlencoded";
76
request.Method = "POST";
77![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
78
byte[] b = encoding.GetBytes(PostData);
79
request.ContentLength = b.Length;
80
using (System.IO.Stream sw = request.GetRequestStream())
81![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
82
try
83![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
84
sw.Write(b, 0, b.Length);
85
}
86
catch (Exception ex)
87![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
88
throw new Exception("Post Data Error!!", ex);
89
}
90
finally
91![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
92![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (sw != null)
{ sw.Close(); }
93
}
94
}
95
}
96![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
97![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
98
HttpWebResponse response = null;
99
System.IO.StreamReader sr = null;
100![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
101
try
102![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
103![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
104
response = (HttpWebResponse)request.GetResponse();
105
106
_Cookies = response.Cookies;
107![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
108
sr = new System.IO.StreamReader(response.GetResponseStream(), encoding);
109![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
110
_Html = sr.ReadToEnd();
111![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
112
}
113
catch (WebException webex)
114![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
115
if (webex.Status == WebExceptionStatus.KeepAliveFailure)
116![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
117
isKeepAlive = true;
118
}
119
else
120![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
121
throw new Exception("DownLoad Data Error", webex);
122
}
123
}
124
catch (System.Exception ex)
125![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
126
throw new Exception("DownLoad Data Error", ex);
127
}
128
finally
129![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
130![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (sr != null)
{ sr.Close(); }
131![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
if (response != null)
{ response.Close(); }
132
response = null;
133
request = null;
134
}
135![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
136
return _Html;
137![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
138
}
139
}
140
}
141
使用方法如下
WebPageReader的使用方法
1
private WebPageReader webReader = new WebPageReader();
2![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
3
string __VIEWSTATE = "/wEPDwUKMTg4ODA4NDE0NmRk6Ma0MaCJKrrNLGLfO4qYNezoxY4=";
4
string __EVENTVALIDATION = "/wEWBQKcopufDgLEhISFCwKd+7qdDgLynailDAKT+PmaCJleqITXMfQuE9LK49YoxHV2oTzQ";
5![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
6
__VIEWSTATE = System.Web.HttpUtility.UrlEncode(__VIEWSTATE);
7![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
8
__EVENTVALIDATION = System.Web.HttpUtility.UrlEncode(__EVENTVALIDATION);
9![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
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![](http://www.cnblogs.com/Images/OutliningIndicators/None.gif)
15
try
16![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
17
do
18![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
19
strHTML = webReader.GetHTML("http://localhost:3517/WebSite1/Default.aspx", strPostData);
20
} while (webReader.IsKeepAlive);
21![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22![](http://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
this.richTextBox1.Text = strHTML;
24
}
25
catch (Exception ex)
26![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](http://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
27
if (ex.InnerException != null)
28![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
29
MessageBox.Show(ex.Message + "/n" + ex.InnerException.Message);
30
}
31
else
32![](http://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
33
MessageBox.Show(ex.Message);
34
}
35
}