在没有做题目中所述的内容的时候,感觉这应该是很简单的东西,但是当真正开始做的时候却发现,有很多问题
现在在这里写出来,供和我一样水平不高的参考一下。
在写本文之前参照了一下文章
欢迎使用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按钮的提交数据
然后创建一个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
}
现在在这里写出来,供和我一样水平不高的参考一下。
在写本文之前参照了一下文章
欢迎使用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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

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 );
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

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

使用方法如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35
