实现代码来源于网络,我只是作了一些修改!
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
using
System;
using
System.Web;
using
System.Xml;
using
System.Collections;
using
System.Net;
using
System.Text;
using
System.IO;
using
System.Xml.Serialization;
/// <summary>
/// 利用WebRequest/WebResponse进行WebService调用的类
/// </summary>
public
class
WebServiceHelper
{
//<webServices>
// <protocols>
// <add name="HttpGet"/>
// <add name="HttpPost"/>
// </protocols>
//</webServices>
private
static
Hashtable _xmlNamespaces =
new
Hashtable();
//缓存xmlNamespace,避免重复调用GetNamespace
/// <summary>
/// 需要WebService支持Post调用
/// </summary>
public
static
XmlDocument QueryPostWebService(String URL, String MethodName, Hashtable Pars)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL +
"/"
+ MethodName);
request.Method =
"POST"
;
request.ContentType =
"application/x-www-form-urlencoded"
;
SetWebRequest(request);
byte
[] data = EncodePars(Pars);
WriteRequestData(request, data);
return
ReadXmlResponse(request.GetResponse());
}
/// <summary>
/// 需要WebService支持Get调用
/// </summary>
public
static
XmlDocument QueryGetWebService(String URL, String MethodName, Hashtable Pars)
{
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL +
"/"
+ MethodName +
"?"
+ ParsToString(Pars));
request.Method =
"GET"
;
request.ContentType =
"application/x-www-form-urlencoded"
;
SetWebRequest(request);
return
ReadXmlResponse(request.GetResponse());
}
/// <summary>
/// 通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
/// </summary>
public
static
XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars)
{
if
(_xmlNamespaces.ContainsKey(URL))
{
return
QuerySoapWebService(URL, MethodName, Pars, _xmlNamespaces[URL].ToString());
}
else
{
return
QuerySoapWebService(URL, MethodName, Pars, GetNamespace(URL));
}
}
/// <summary>
/// 通用WebService调用(Soap)
/// </summary>
/// <param name="URL"></param>
/// <param name="MethodName"></param>
/// <param name="Pars"></param>
/// <param name="XmlNs"></param>
/// <returns></returns>
private
static
XmlDocument QuerySoapWebService(String URL, String MethodName, Hashtable Pars,
string
XmlNs)
{
_xmlNamespaces[URL] = XmlNs;
//加入缓存,提高效率
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(URL);
request.Method =
"POST"
;
request.ContentType =
"text/xml; charset=utf-8"
;
request.Headers.Add(
"SOAPAction"
,
"\""
+ XmlNs + (XmlNs.EndsWith(
"/"
) ?
""
:
"/"
) + MethodName +
"\""
);
SetWebRequest(request);
byte
[] data = EncodeParsToSoap(Pars, XmlNs, MethodName);
WriteRequestData(request, data);
XmlDocument doc =
new
XmlDocument(), doc2 =
new
XmlDocument();
doc = ReadXmlResponse(request.GetResponse());
XmlNamespaceManager mgr =
new
XmlNamespaceManager(doc.NameTable);
mgr.AddNamespace(
"soap"
,
"http://schemas.xmlsoap.org/soap/envelope/"
);
String RetXml = doc.SelectSingleNode(
"//soap:Body/*/*"
, mgr).InnerXml;
doc2.LoadXml(
"<root>"
+ RetXml +
"</root>"
);
AddDelaration(doc2);
return
doc2;
}
/// <summary>
/// 通过WebService的WSDL获取XML名称空间
/// </summary>
/// <param name="URL"></param>
/// <returns></returns>
private
static
string
GetNamespace(String URL)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL +
"?WSDL"
);
SetWebRequest(request);
WebResponse response = request.GetResponse();
StreamReader sr =
new
StreamReader(response.GetResponseStream(), Encoding.UTF8);
XmlDocument doc =
new
XmlDocument();
doc.LoadXml(sr.ReadToEnd());
sr.Close();
return
doc.SelectSingleNode(
"//@targetNamespace"
).Value;
}
/// <summary>
/// 动态生成SOP请求报文内容
/// </summary>
/// <param name="Pars"></param>
/// <param name="XmlNs"></param>
/// <param name="MethodName"></param>
/// <returns></returns>
private
static
byte
[] EncodeParsToSoap(Hashtable Pars, String XmlNs, String MethodName)
{
XmlDocument doc =
new
XmlDocument();
doc.LoadXml(
"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\"></soap:Envelope>"
);
AddDelaration(doc);
XmlElement soapBody = doc.CreateElement(
"soap"
,
"Body"
,
"http://schemas.xmlsoap.org/soap/envelope/"
);
XmlElement soapMethod = doc.CreateElement(MethodName);
soapMethod.SetAttribute(
"xmlns"
, XmlNs);
foreach
(
string
k
in
Pars.Keys)
{
XmlElement soapPar = doc.CreateElement(k);
soapPar.InnerXml = ObjectToSoapXml(Pars[k]);
soapMethod.AppendChild(soapPar);
}
soapBody.AppendChild(soapMethod);
doc.DocumentElement.AppendChild(soapBody);
return
Encoding.UTF8.GetBytes(doc.OuterXml);
}
/// <summary>
/// 将对象转换成XML节点格式
/// </summary>
/// <param name="o"></param>
/// <returns></returns>
private
static
string
ObjectToSoapXml(
object
o)
{
XmlSerializer mySerializer =
new
XmlSerializer(o.GetType());
MemoryStream ms =
new
MemoryStream();
mySerializer.Serialize(ms, o);
XmlDocument doc =
new
XmlDocument();
doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
if
(doc.DocumentElement !=
null
)
{
return
doc.DocumentElement.InnerXml;
}
else
{
return
o.ToString();
}
}
/// <summary>
/// 设置WEB请求
/// </summary>
/// <param name="request"></param>
private
static
void
SetWebRequest(HttpWebRequest request)
{
request.Credentials = CredentialCache.DefaultCredentials;
request.Timeout = 10000;
}
/// <summary>
/// 设置请求数据
/// </summary>
/// <param name="request"></param>
/// <param name="data"></param>
private
static
void
WriteRequestData(HttpWebRequest request,
byte
[] data)
{
request.ContentLength = data.Length;
Stream writer = request.GetRequestStream();
writer.Write(data, 0, data.Length);
writer.Close();
}
/// <summary>
/// 获取字符串的UTF8码字符串
/// </summary>
/// <param name="Pars"></param>
/// <returns></returns>
private
static
byte
[] EncodePars(Hashtable Pars)
{
return
Encoding.UTF8.GetBytes(ParsToString(Pars));
}
/// <summary>
/// 将Hashtable转换成WEB请求键值对字符串
/// </summary>
/// <param name="Pars"></param>
/// <returns></returns>
private
static
String ParsToString(Hashtable Pars)
{
StringBuilder sb =
new
StringBuilder();
foreach
(
string
k
in
Pars.Keys)
{
if
(sb.Length > 0)
{
sb.Append(
"&"
);
}
sb.Append(HttpUtility.UrlEncode(k) +
"="
+ HttpUtility.UrlEncode(Pars[k].ToString()));
}
return
sb.ToString();
}
/// <summary>
/// 获取Webservice响应报文XML
/// </summary>
/// <param name="response"></param>
/// <returns></returns>
private
static
XmlDocument ReadXmlResponse(WebResponse response)
{
StreamReader sr =
new
StreamReader(response.GetResponseStream(), Encoding.UTF8);
String retXml = sr.ReadToEnd();
sr.Close();
XmlDocument doc =
new
XmlDocument();
doc.LoadXml(retXml);
return
doc;
}
/// <summary>
/// 设置XML文档版本声明
/// </summary>
/// <param name="doc"></param>
private
static
void
AddDelaration(XmlDocument doc)
{
XmlDeclaration decl = doc.CreateXmlDeclaration(
"1.0"
,
"utf-8"
,
null
);
doc.InsertBefore(decl, doc.DocumentElement);
}
}
|
以上是在不引用WEB服务的条件下动态调用WEB服务方法,如果该服务地址不确定或后期有可能会变动,则采用上述这些方法会比较好,当然如果服务地址不会出现变更的情况下,可以在VS中直接引用WEB服务,然后就可调用自动生成的SOAPClient类来调用相应的WEB服务方法,这样就简单很多,如下:
1
2
3
|
avar client =
new
SmsService.wmgwSoapClient();
//wmgwSoapClient就是引用WEB服务后自动生成的类
string
result = client.MongateSendSubmit(tuserId.Text, tpassword.Text, tpszMobis.Text, tpszMsg.Text,
int
.Parse(tiMobiCount.Text),
tpszSubPort.Text, tMsgId.Text);
|
更多IT相关技术文章与资讯,欢迎光临我的个人网站:http://www.zuowenjun.cn
本文转自 梦在旅途 博客园博客,原文链接:http://www.cnblogs.com/zuowj/p/4267585.html ,如需转载请自行联系原作者