博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 通过Get、Post、Soap调用WebService的方法
阅读量:6452 次
发布时间:2019-06-23

本文共 8026 字,大约阅读时间需要 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
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.cnblogs.com/zuowj/p/4267585.html  ,如需转载请自行联系原作者

你可能感兴趣的文章
bzoj4589 Hard Nim
查看>>
JSON 请求太大,无法反序列化。
查看>>
mysql gen.ci_mysql cmake 参数详解
查看>>
pcdmis怎么导出模型_3D游戏模型提取、导入、导出教程
查看>>
pythonprint的使用方法_python print用法是什么
查看>>
libevent mysql php_linux+nginx+mysql+php的简单配置
查看>>
python爬虫周志_python爬虫第二周
查看>>
python语言迷宫游戏_python代码实现一个迷宫小游戏
查看>>
rpmbuild打包mysql5.7_关于rpmbuild打包mysql造成无法启用aio功能
查看>>
mongodb启动成功连不上_MongoDB无法连接/认证失败
查看>>
mysql myisam引擎_试题-说一下mysql的MyISAM引擎 - 拿OFFER
查看>>
mysql 单机 最高负载_haproxy(单机)+mysql集群负载均衡
查看>>
oldpassword mysql_mysql OLD_PASSWORD's problem | 2hei's site
查看>>
python grequests极限_在Python中利用grequests实现一个并发请求功能
查看>>
python通过sum函数实现1到n的和_Python定义函数实现累计求和操作
查看>>
python隐藏源代码_隐身 对 《Python源码剖析》 的评论 | 豆瓣阅读
查看>>
华南x79主板u盘装系统教程_华南x79主板怎么装win7系统|华南x79主板装win7及BIOS设置...
查看>>
结构化查询语句简称mysql_整理MySql常用查询语句
查看>>
java spring 数据库连接_Spring连接数据库的几种常用的方式
查看>>
java list 分组数量_java8 集合 多字段 分组 统计个数代码
查看>>