一、C#利用vs里面自带的“添加web引用”功能:

1.首先需要清楚WSDL的引用地址
如:http://www.webxml.com.cn/Webservices/WeatherWebService.asmx

2.在.Net项目中,添加web引用。


3.在弹出页面中,输入URL->点击点击绿色图标(前往)按钮->自定义引用名->点击添加引用


4.添加成功,查看类中可调用的方法:


5.在项目中,调用wsdl中的方法。

[csharp]view plaincopy
  1. privatevoidbutton1_Click(objectsender,EventArgse)
  2. {
  3. testWS2.Weather.WeatherWebServiceobjWeather=newWeather.WeatherWebService();
  4. stringstrCityName="上海";
  5. string[]arrWeather=objWeather.getWeatherbyCityName(strCityName);
  6. MessageBox.Show(arrWeather[10]);
  7. }

6.注意事项:
(1)如果看不到第四步类,点击项目上面的“显示所有文件”图标按钮;
(2)如果目标框架.NET Framework 4.0生成的第四步类无可调用的方法,可以试一下“.NET Framework 2.0”;

二、C# .Net采用GET/POST/SOAP方式动态调用WebService的简易灵活方法

参考:http://blog.csdn.net/chlyzone/article/details/8210718
这个类有三个公用的方法:QuerySoapWebService为通用的采用Soap方式调用WebService,QueryGetWebService采用GET方式调用,QueryPostWebService采用POST方式调用,后两个方法需要WebService服务器支持相应的调用方式。三个方法的参数和返回值相同:URL为Webservice的Url地址(以.asmx结尾的);MethodName为要调用的方法名称;Pars为参数表,它的Key为参数名称,Value为要传递的参数的值,Value可为任意对象,前提是这个对象可以被xml序列化。注意方法名称、参数名称、参数个数必须完全匹配才能正确调用。第一次以Soap方式调用时,因为需要查询WSDL获取xmlns,因此需要时间相对长些,第二次调用不用再读WSDL,直接从缓存读取。这三个方法的返回值均为XmlDocument对象,这个返回的对象可以进行各种灵活的操作。最常用的一个SelectSingleNode方法,可以让你一步定位到Xml的任何节点,再读取它的文本或属性。也可以直接调用Save保存到磁盘。采用Soap方式调用时,根结点名称固定为root。
这个类主要是利用了WebRequest/WebResponse来完成各种网络查询操作。为了精简明了,这个类中没有添加错误处理,需要在调用的地方设置异常捕获。

[csharp]view plaincopy
  1. usingSystem;
  2. usingSystem.Web;
  3. usingSystem.Xml;
  4. usingSystem.Collections;
  5. usingSystem.Net;
  6. usingSystem.Text;
  7. usingSystem.IO;
  8. usingSystem.Xml.Serialization;
  9. //Byhuangz2008-3-19
  10. /**/
  11. ///<summary>
  12. ///利用WebRequest/WebResponse进行WebService调用的类,By同济黄正http://hz932.ys168.com2008-3-19
  13. ///</summary>
  14. publicclassWebSvcCaller
  15. {
  16. //<webServices>
  17. //<protocols>
  18. //<addname="HttpGet"/>
  19. //<addname="HttpPost"/>
  20. //</protocols>
  21. //</webServices>
  22. privatestaticHashtable_xmlNamespaces=newHashtable();//缓存xmlNamespace,避免重复调用GetNamespace
  23. /**/
  24. ///<summary>
  25. ///需要WebService支持Post调用
  26. ///</summary>
  27. publicstaticXmlDocumentQueryPostWebService(StringURL,StringMethodName,HashtablePars)
  28. {
  29. HttpWebRequestrequest=(HttpWebRequest)HttpWebRequest.Create(URL+"/"+MethodName);
  30. request.Method="POST";
  31. request.ContentType="application/x-www-form-urlencoded";
  32. SetWebRequest(request);
  33. byte[]data=EncodePars(Pars);
  34. WriteRequestData(request,data);
  35. returnReadXmlResponse(request.GetResponse());
  36. }
  37. /**/
  38. ///<summary>
  39. ///需要WebService支持Get调用
  40. ///</summary>
  41. publicstaticXmlDocumentQueryGetWebService(StringURL,StringMethodName,HashtablePars)
  42. {
  43. HttpWebRequestrequest=(HttpWebRequest)HttpWebRequest.Create(URL+"/"+MethodName+"?"+ParsToString(Pars));
  44. request.Method="GET";
  45. request.ContentType="application/x-www-form-urlencoded";
  46. SetWebRequest(request);
  47. returnReadXmlResponse(request.GetResponse());
  48. }
  49. /**/
  50. ///<summary>
  51. ///通用WebService调用(Soap),参数Pars为String类型的参数名、参数值
  52. ///</summary>
  53. publicstaticXmlDocumentQuerySoapWebService(StringURL,StringMethodName,HashtablePars)
  54. {
  55. if(_xmlNamespaces.ContainsKey(URL))
  56. {
  57. returnQuerySoapWebService(URL,MethodName,Pars,_xmlNamespaces[URL].ToString());
  58. }
  59. else
  60. {
  61. returnQuerySoapWebService(URL,MethodName,Pars,GetNamespace(URL));
  62. }
  63. }
  64. privatestaticXmlDocumentQuerySoapWebService(StringURL,StringMethodName,HashtablePars,stringXmlNs)
  65. {
  66. _xmlNamespaces[URL]=XmlNs;//加入缓存,提高效率
  67. HttpWebRequestrequest=(HttpWebRequest)HttpWebRequest.Create(URL);
  68. request.Method="POST";
  69. request.ContentType="text/xml;charset=utf-8";
  70. request.Headers.Add("SOAPAction","\""+XmlNs+(XmlNs.EndsWith("/")?"":"/")+MethodName+"\"");
  71. SetWebRequest(request);
  72. byte[]data=EncodeParsToSoap(Pars,XmlNs,MethodName);
  73. WriteRequestData(request,data);
  74. XmlDocumentdoc=newXmlDocument(),doc2=newXmlDocument();
  75. doc=ReadXmlResponse(request.GetResponse());
  76. XmlNamespaceManagermgr=newXmlNamespaceManager(doc.NameTable);
  77. mgr.AddNamespace("soap","http://schemas.xmlsoap.org/soap/envelope/");
  78. StringRetXml=doc.SelectSingleNode("//soap:Body/*/*",mgr).InnerXml;
  79. doc2.LoadXml("<root>"+RetXml+"</root>");
  80. AddDelaration(doc2);
  81. returndoc2;
  82. }
  83. privatestaticstringGetNamespace(StringURL)
  84. {
  85. HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(URL+"?WSDL");
  86. SetWebRequest(request);
  87. WebResponseresponse=request.GetResponse();
  88. StreamReadersr=newStreamReader(response.GetResponseStream(),Encoding.UTF8);
  89. XmlDocumentdoc=newXmlDocument();
  90. doc.LoadXml(sr.ReadToEnd());
  91. sr.Close();
  92. returndoc.SelectSingleNode("//@targetNamespace").Value;
  93. }
  94. privatestaticbyte[]EncodeParsToSoap(HashtablePars,StringXmlNs,StringMethodName)
  95. {
  96. XmlDocumentdoc=newXmlDocument();
  97. doc.LoadXml("<soap:Envelopexmlns: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>");
  98. AddDelaration(doc);
  99. XmlElementsoapBody=doc.CreateElement("soap","Body","http://schemas.xmlsoap.org/soap/envelope/");
  100. XmlElementsoapMethod=doc.CreateElement(MethodName);
  101. soapMethod.SetAttribute("xmlns",XmlNs);
  102. foreach(stringkinPars.Keys)
  103. {
  104. XmlElementsoapPar=doc.CreateElement(k);
  105. soapPar.InnerXml=ObjectToSoapXml(Pars[k]);
  106. soapMethod.AppendChild(soapPar);
  107. }
  108. soapBody.AppendChild(soapMethod);
  109. doc.DocumentElement.AppendChild(soapBody);
  110. returnEncoding.UTF8.GetBytes(doc.OuterXml);
  111. }
  112. privatestaticstringObjectToSoapXml(objecto)
  113. {
  114. XmlSerializermySerializer=newXmlSerializer(o.GetType());
  115. MemoryStreamms=newMemoryStream();
  116. mySerializer.Serialize(ms,o);
  117. XmlDocumentdoc=newXmlDocument();
  118. doc.LoadXml(Encoding.UTF8.GetString(ms.ToArray()));
  119. if(doc.DocumentElement!=null)
  120. {
  121. returndoc.DocumentElement.InnerXml;
  122. }
  123. else
  124. {
  125. returno.ToString();
  126. }
  127. }
  128. privatestaticvoidSetWebRequest(HttpWebRequestrequest)
  129. {
  130. request.Credentials=CredentialCache.DefaultCredentials;
  131. request.Timeout=10000;
  132. }
  133. privatestaticvoidWriteRequestData(HttpWebRequestrequest,byte[]data)
  134. {
  135. request.ContentLength=data.Length;
  136. Streamwriter=request.GetRequestStream();
  137. writer.Write(data,0,data.Length);
  138. writer.Close();
  139. }
  140. privatestaticbyte[]EncodePars(HashtablePars)
  141. {
  142. returnEncoding.UTF8.GetBytes(ParsToString(Pars));
  143. }
  144. privatestaticStringParsToString(HashtablePars)
  145. {
  146. StringBuildersb=newStringBuilder();
  147. foreach(stringkinPars.Keys)
  148. {
  149. if(sb.Length>0)
  150. {
  151. sb.Append("&");
  152. }
  153. sb.Append(HttpUtility.UrlEncode(k)+"="+HttpUtility.UrlEncode(Pars[k].ToString()));
  154. }
  155. returnsb.ToString();
  156. }
  157. privatestaticXmlDocumentReadXmlResponse(WebResponseresponse)
  158. {
  159. StreamReadersr=newStreamReader(response.GetResponseStream(),Encoding.UTF8);
  160. StringretXml=sr.ReadToEnd();
  161. sr.Close();
  162. XmlDocumentdoc=newXmlDocument();
  163. doc.LoadXml(retXml);
  164. returndoc;
  165. }
  166. privatestaticvoidAddDelaration(XmlDocumentdoc)
  167. {
  168. XmlDeclarationdecl=doc.CreateXmlDeclaration("1.0","utf-8",null);
  169. doc.InsertBefore(decl,doc.DocumentElement);
  170. }
  171. }


调用:

[csharp]view plaincopy
  1. voidbtnTest2_Click(objectsender,EventArgse)
  2. {
  3. try
  4. {
  5. Hashtablepars=newHashtable();
  6. StringUrl="http://www.webxml.com.cn/Webservices/WeatherWebService.asmx";
  7. XmlDocumentdoc=WebSvcCaller.QuerySoapWebService(Url,"getSupportProvince",pars);
  8. Response.Write(doc.OuterXml);
  9. }
  10. catch(Exceptionex)
  11. {
  12. Response.Write(ex.Message);
  13. }
  14. }
三、Java使用SOAP调用webservice实例解析

参照:http://www.cnblogs.com/linjiqin/archive/2012/05/07/2488880.html

1.webservice提供方:http://www.webxml.com.cn/zh_cn/index.aspx
2.下面我们以“获得腾讯QQ在线状态”为例。
[http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx?op=qqCheckOnline] 点击前面的网址,查看对应参数信息。

3.Java程序

[java]view plaincopy
  1. packagecom.test.qqwstest;
  2. importjava.io.BufferedReader;
  3. importjava.io.BufferedWriter;
  4. importjava.io.ByteArrayOutputStream;
  5. importjava.io.File;
  6. importjava.io.FileInputStream;
  7. importjava.io.FileOutputStream;
  8. importjava.io.IOException;
  9. importjava.io.InputStream;
  10. importjava.io.InputStreamReader;
  11. importjava.io.OutputStream;
  12. importjava.io.OutputStreamWriter;
  13. importjava.io.PrintWriter;
  14. importjava.io.UnsupportedEncodingException;
  15. importjava.net.HttpURLConnection;
  16. importjava.net.URL;
  17. publicclassJxSendSmsTest{
  18. publicstaticvoidmain(String[]args){
  19. sendSms();
  20. }
  21. /**
  22. *获得腾讯QQ在线状态
  23. *
  24. *输入参数:QQ号码String,默认QQ号码:8698053。返回数据:String,Y=在线;N=离线;E=QQ号码错误;A=商业用户验证失败;V=免费用户超过数量
  25. *@throwsException
  26. */
  27. publicstaticvoidsendSms(){
  28. try{
  29. StringqqCode="2379538089";//qq号码
  30. StringurlString="http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx";
  31. Stringxml=JxSendSmsTest.class.getClassLoader().getResource("SendInstantSms.xml").getFile();
  32. StringxmlFile=replace(xml,"qqCodeTmp",qqCode).getPath();
  33. StringsoapActionString="http://WebXml.com.cn/qqCheckOnline";
  34. URLurl=newURL(urlString);
  35. HttpURLConnectionhttpConn=(HttpURLConnection)url.openConnection();
  36. FilefileToSend=newFile(xmlFile);
  37. byte[]buf=newbyte[(int)fileToSend.length()];
  38. newFileInputStream(xmlFile).read(buf);
  39. httpConn.setRequestProperty("Content-Length",String.valueOf(buf.length));
  40. httpConn.setRequestProperty("Content-Type","text/xml;charset=utf-8");
  41. httpConn.setRequestProperty("soapActionString",soapActionString);
  42. httpConn.setRequestMethod("POST");
  43. httpConn.setDoOutput(true);
  44. httpConn.setDoInput(true);
  45. OutputStreamout=httpConn.getOutputStream();
  46. out.write(buf);
  47. out.close();
  48. byte[]datas=readInputStream(httpConn.getInputStream());
  49. Stringresult=newString(datas);
  50. //打印返回结果
  51. System.out.println("result:"+result);
  52. }
  53. catch(Exceptione){
  54. System.out.println("result:error!");
  55. }
  56. }
  57. /**
  58. *文件内容替换
  59. *
  60. *@paraminFileName源文件
  61. *@paramfrom
  62. *@paramto
  63. *@return返回替换后文件
  64. *@throwsIOException
  65. *@throwsUnsupportedEncodingException
  66. */
  67. publicstaticFilereplace(StringinFileName,Stringfrom,Stringto)
  68. throwsIOException,UnsupportedEncodingException{
  69. FileinFile=newFile(inFileName);
  70. BufferedReaderin=newBufferedReader(newInputStreamReader(
  71. newFileInputStream(inFile),"utf-8"));
  72. FileoutFile=newFile(inFile+".tmp");
  73. PrintWriterout=newPrintWriter(newBufferedWriter(
  74. newOutputStreamWriter(newFileOutputStream(outFile),"utf-8")));
  75. Stringreading;
  76. while((reading=in.readLine())!=null){
  77. out.println(reading.replaceAll(from,to));
  78. }
  79. out.close();
  80. in.close();
  81. //infile.delete();//删除源文件
  82. //outfile.renameTo(infile);//对临时文件重命名
  83. returnoutFile;
  84. }
  85. /**
  86. *从输入流中读取数据
  87. *@paraminStream
  88. *@return
  89. *@throwsException
  90. */
  91. publicstaticbyte[]readInputStream(InputStreaminStream)throwsException{
  92. ByteArrayOutputStreamoutStream=newByteArrayOutputStream();
  93. byte[]buffer=newbyte[1024];
  94. intlen=0;
  95. while((len=inStream.read(buffer))!=-1){
  96. outStream.write(buffer,0,len);
  97. }
  98. byte[]data=outStream.toByteArray();//网页的二进制数据
  99. outStream.close();
  100. inStream.close();
  101. returndata;
  102. }
  103. }

4、SendInstantSms.xml文件如下,放在src目录下

[html]view plaincopy
    1. <?xmlversion="1.0"encoding="utf-8"?>
    2. <soap:Envelopexmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:xsd="http://www.w3.org/2001/XMLSchema"xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    3. <soap:Body>
    4. <qqCheckOnlinexmlns="http://WebXml.com.cn/">
    5. <qqCode>qqCodeTmp</qqCode>
    6. </qqCheckOnline>
    7. </soap:Body>
    8. </soap:Envelope>

更多相关文章

  1. Javadoc转换chm帮助文档的四种方法总结
  2. 最新Eclipse配置Android开发环境SDK 并安装JellyBean 4.3的方法
  3. Android 两种制作圆形/圆角图片的方法
  4. 在android中运行java main方法
  5. android studio 无法调试安装到小米手机解决方法
  6. OpenGL es 2.0使用shadow mapping方法制作阴影时,阴影穿透实体现
  7. Android studio Run 出现 红叉 AndroidRunConfigurationType 问
  8. 如何在函数中将两个参数从1个类传递给另一个?
  9. 如何在Log中模拟方法e

随机推荐

  1. 对于表格数据,什么渲染更快,CSS或?
  2. Chrome 50更改隐式表格单元格高度行为
  3. js 隐藏、显示html 标签内容
  4. 经典炫酷的HTML5/jQuery动画应用示例及源
  5. Js 之将html转为图片html2canvas
  6. 用HTML5为你的网页添加音效(兼容Firefox 3
  7. ACCP7.0S1HTML第一章上机练习4
  8. js报错:****is not a function 的解决方法
  9. Google地图不显示[重复]
  10. IFrame中的Div没有达到给定的高度