C# 通过Get、Post、Soap调用WebService的方法

简介:

实现代码来源于网络,我只是作了一些修改!

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  ,如需转载请自行联系原作者

相关文章
|
4月前
|
开发框架 .NET 程序员
C# 去掉字符串最后一个字符的 4 种方法
在实际业务中,我们经常会遇到在循环中拼接字符串的场景,循环结束之后拼接得到的字符串的最后一个字符往往需要去掉,看看 C# 提供了哪4种方法可以高效去掉字符串的最后一个字符
429 0
|
1月前
|
开发框架 监控 .NET
C#进阶-ASP.NET WebForms调用ASMX的WebService接口
通过本文的介绍,希望您能深入理解并掌握ASP.NET WebForms中调用ASMX WebService接口的方法和技巧,并在实际项目中灵活运用这些技术,提高开发效率和应用性能。
44 5
|
3月前
|
编译器 C#
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
C#多态概述:通过继承实现的不同对象调用相同的方法,表现出不同的行为
138 65
|
2月前
|
JSON 程序员 C#
使用 C# 比较两个对象是否相等的7个方法总结
比较对象是编程中的一项基本技能,在实际业务中经常碰到,比如在ERP系统中,企业的信息非常重要,每一次更新,都需要比较记录更新前后企业的信息,直接比较通常只能告诉我们它们是否指向同一个内存地址,那我们应该怎么办呢?分享 7 个方法给你!
|
2月前
|
C# UED SEO
C# 异步方法async / await任务超时处理
通过使用 `Task.WhenAny`和 `Task.Delay`方法,您可以在C#中有效地实现异步任务的超时处理机制。这种方法允许您在指定时间内等待任务完成,并在任务超时时采取适当的措施,如抛出异常或执行备用操作。希望本文提供的详细解释和代码示例能帮助您在实际项目中更好地处理异步任务超时问题,提升应用程序的可靠性和用户体验。
100 3
|
3月前
|
存储 C#
【C#】大批量判断文件是否存在的两种方法效率对比
【C#】大批量判断文件是否存在的两种方法效率对比
62 1
|
4月前
|
C#
C#一分钟浅谈:Lambda 表达式和匿名方法
本文详细介绍了C#编程中的Lambda表达式与匿名方法,两者均可用于定义无名函数,使代码更简洁易维护。文章通过基础概念讲解和示例对比,展示了各自语法特点,如Lambda表达式的`(parameters) =&gt; expression`形式及匿名方法的`delegate(parameters)`结构。并通过实例演示了两者的应用差异,强调了在使用Lambda时应注意闭包问题及其解决策略,推荐优先使用Lambda表达式以增强代码可读性。
60 8
|
3月前
|
C#
C#的方法的参数传递
C#的方法的参数传递
37 0
|
3月前
|
数据可视化 程序员 C#
C#中windows应用窗体程序的输入输出方法实例
C#中windows应用窗体程序的输入输出方法实例
66 0
|
5月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
148 0