设为首页 收藏本站
查看: 1228|回复: 0

[经验分享] HOW TO:将 Apache SOAP 2.2 客户程序与 .NET XML Web 服务集成

[复制链接]

尚未签到

发表于 2017-1-13 10:38:43 | 显示全部楼层 |阅读模式
<meta content="text/html; charset=utf-8" http-equiv="CONTENT-TYPE"><meta content="OpenOffice.org 2.0  (Linux)" name="GENERATOR">
<meta content="20070110;15263000" name="CREATED">
<meta content="16010101;0" name="CHANGED">     <style type="text/css"></style>
http://support.microsoft.com/kb/308466/zh-cn

  <script type="text/javascript">
function loadTOCNode(){}
</script>文章编号
  :
  308466
  最后修改
  :
  2003年8月6日
  修订
  :
  1.0

本页

DSC0000.gif 概要
要求
.NET XML Web 服务
Apache SOAP 工具包
Java 代理
覆盖 Body 序列化
分析响应
疑难解答
参考




<script type="text/javascript">var sectionFilter = "type != 'notice' && type != 'securedata' && type != 'querywords'";var tocArrow = "/library/images/support/kbgraphics/public/en-us/downarrow.gif";var depthLimit = 10;var depth3Limit = 10;var depth4Limit = 5;var depth5Limit = 3;var tocEntryMinimum = 1;</script>
<script src="http://support.microsoft.com/common/script/gsfx/kbtoc.js??4" type="text/javascript"></script>
<noscript></noscript>概要

  
<script type="text/javascript">
loadTOCNode(1, 'summary');
</script>
本文逐步介绍了如何将 Apache SOAP 2.2 客户程序与基于 Active Server Page (ASP) .NET 的 XML Web 服务集成。本文假设 ASP .NET 服务器端的组件通过 WebMethod 属性公开 Web 方法,并且除了为 Web 服务本身提供名称空间以外,不做任何事情。

DSC0001.gif

  回到顶端

要求


<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
以下各项内容描述推荐使用的硬件、软件、网络结构、技能和知识以及所需的 Service Pack:  

  ·
  Java JDK 1.3 版
  ·
  Apache SOAP 2.2 版  

本文假定您熟悉下列主题:  

  ·
  Apache SOAP 2.2 库设置
  ·
  Java 语言和 JavaBean 技术
  ·
  Web 服务说明语言 (WSDL) 文件
  ·
  用于 XML 的简单 API (SAX) XML 分析模型
  有关如何设置 Apache SOAP 2.2 库的详细信息,请参考这些产品的下载资料以及本文结尾处的参考 。
当使用 SOAP 接口中的复杂类型时,了解 JavaBean 技术会有所帮助。另外,在创建各种 Java 类时,还需要在一定程度上熟悉 Web 服务说明语言 (WSDL) 文件。  


  回到顶端

.NET XML Web 服务
  
<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
本文假设您的 .NET Web 服务类似于:
Microsoft Visual C# .NET

public class SimpleService : System.Web.Services.WebService {     public SimpleService() {     }      [WebMethod]     public string echoString(string inputString) {         if ( inputString == null ) {             return "Input string is null";         }         return inputString;     } }                                 
  Microsoft Visual Basic .NET

Public Class SimpleService     Inherits System.Web.Services.WebService      Public Sub New()         MyBase.New()     End Sub      <WebMethod()> Public Function echoString( _         ByVal inputString As String) As String          echoString = inputString     End Function  End Class                                 
  这些声明告诉 .NET 运行时库不要期望任何编码信息,并告诉它将消息解释为文档或文本类型。也就是说,元素名称有某种含义,并且由服务器负责了解传入了什么数据类型。


  回到顶端

Apache SOAP 工具包


<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
Apache SOAP 工具包用做远程过程调用 (RPC) 机制而不是文档交换机制。它希望将消息交换机制进行 RPC 编码。因此,必须按照下列步骤操作以便各个部分都正常工作:

  1.
  为 .NET 终结点编写 Java 代理。
  2.
  创建一个类以生成 SOAP 消息的 Body 元素。
  3.
  创建一个类以分析 SOAP 响应。


  回到顶端

Java 代理
  
<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
IBM Web 服务工具包可以生成代理;但是,由于在生成代理后您需要完成大量的工作,因而手工编写代理通常更容易。除这一点外,还需要编写函数,以模仿与所连接的 portType 相关联的操作 WSDL 中的签名。例如,echoString 函数签名与下面类似:  

public synchronized String echoString( String inputString )        throws SOAPException                                 
这允许代理用户实例化代理和调用函数,并只需考虑如何处理 SOAP 错误。代理执行下列步骤:

  1.
  验证是否已设置了 URL。
  2.
  准备消息。
  3.
  发送消息。
  4.
  分析响应。
  鉴于 Apache SOAP 2.2 类对消息进行编码的方式,您必须覆盖生成消息正文的代码段以及解释响应的代码段。必须更改处理响应的方式,原因是对 Apache 所做的更改超出了原始 RPC 设计。调用 echoString 的完整代码类似于下面这样:

public synchronized String echoString( String inputString )      throws SOAPException {     String retval = "";     if (url == null) {         throw new SOAPException(Constants.FAULT_CODE_CLIENT,         "A URL must be specified via " +         "SoapBuildersExSoapProxy.setEndPoint(URL).");     }      // Instantiate the message and the envelope.     // The message sends the envelope and gets     // the response.     Message message = new Message();     Envelope env = new Envelope();     DataHandler soapMsg = null;      // Get this from the soapAction attribute on the     // soap:operation element that is found within the SOAP     // binding information in the WSDL.     String SOAPActionURI = "http://tempuri.org/echoString";     MessageBody theBody = new MessageBody();      // Set the argument.     theBody.echoString = inputString;      // Replace the default body with our own.     env.setBody( theBody );     message.send( getEndPoint(), SOAPActionURI, env );     try{         // Because the Body.unmarshall handler is static,         // you cannot replace the basic machinery easily.         // Instead, you must obtain and parse the          // message on your own.          soapMsg = message.receive();         XMLReader xr = XMLReaderFactory.createXMLReader(             "org.apache.xerces.parsers.SAXParser");           ClientHandler ch = new ClientHandler();         ch.setElementToSearchFor("echoStringResult");         // Set the ContentHandler.          xr.setContentHandler( ch );           // Parse the file.          xr.parse( new InputSource(             new StringReader( soapMsg.getContent().toString() ) ) );          // At this point, the result has been parsed and stored         // within the ClientHandler instance.         retval = ch.getResult();     } catch ( Exception e ) {         // You need to do something with the exception.         // Here, we print out the exception to the console.         System.out.println( "***Exception***:  " + e.toString() );     }     return retval; }                                 
  无论实际参数是简单类型(如字符串)还是复杂类型(如数组),此基本窗体都会正常工作。创建 Body 类更困难。必须手工执行序列化操作。


  回到顶端

覆盖 Body 序列化


<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
Apache SOAP 使用一个名为 Body 的类来序列化和反序列化 SOAP 消息。它使用 marshallunmarshall 方法执行上述操作。marshall 方法是实例方法,而 unmarshall 方法是静态类方法。鉴于 Apache SOAP 库的结构和您使用它的方式,您无法从 Body 继承,并且不能期望您自己的 unmarshall 版本被调用。幸好,您可以替换 marshall 并更改序列化 SOAP Body 元素的方式。
要正确地序列化 echoString 方法,请提供您自己的 Body 扩展版本。根据您所拥有的方法的数量,您可以创建一个版本的类来对每个方法扩展 Body,也可以使 marshall 方法根据其他信息选择正确的代码。
假设您只在派生类中序列化一个方法调用,则该类必须包括下列内容:

  ·
  设置所要序列化的数据的方法。
  ·
  有关如何编写 XML 以便其对于 ASP .NET 终结点具有正确格式的知识。

由于 ASP .NET 终结点使用文档/文本编码,因此您只需要写出下面的信息:

  ·
  Body 元素。
  ·
  方法名和相应的名称空间。
  ·
  传入方法中的参数。
  对于 echoString 示例,该类类似于下面这样:  

import java.io.*; import org.apache.soap.util.*; import org.apache.soap.*; import org.apache.soap.util.xml.*; import org.apache.soap.rpc.SOAPContext; public class MessageBody extends Body {        public String echoString;     public void marshall(String inScopeEncStyle,                         Writer sink,                         NSStack nsStack,                        XMLJavaMappingRegistry xjmr,                         SOAPContext ctx)     throws IllegalArgumentException, IOException   {     // Set the Body element     String soapEnvNSPrefix = "SOAP-ENV";     sink.write('<' + soapEnvNSPrefix + ':'          + Constants.ELEM_BODY + '>' + StringUtils.lineSeparator);      // Write out the method name and related argument(s)     sink.write("<echoString xmlns=\"http://tempuri.org/\">" +         "<inputString>" + echoString +         "</inputString></echoString>" );      // Close the SOAP Body     sink.write("</" + soapEnvNSPrefix + ':' +          Constants.ELEM_BODY + '>' + StringUtils.lineSeparator);      nsStack.popScope();   }  }                                 
  既然您可以发送消息,那么您还需要能够读取响应。为此,需要一个由 SAX 分析器调用的类。


  回到顶端

分析响应
  
<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
当消息发出又返回时,您可以确定整个 SOAP 响应。本部分在示例代理的 echoStringtry/catch 块的代码中使用。此 ClientHandler 示例类试图成为可以获取任何一个元素响应的通用类。该类的用户应该能够原封不动地使用它。如果值为 Boolean、日期或数值类型,可以在取得结果后进行转换。更复杂的类型需要更复杂的实现。
要取得简单值,必须执行下面的操作:

import org.xml.sax.helpers.*; import org.xml.sax.*; public class ClientHandler extends DefaultHandler {      private String result = "";     private String elementToSearchFor = "";     private boolean foundResult = false;      public ClientHandler() {     }      public String getResult(){         return result;     }      public void setElementToSearchFor( String elemName ) {         elementToSearchFor = elemName;     }      public String getElementToSearchFor() {         return elementToSearchFor;     }      // Override methods of the DefaultHandler class      // to gain notification of SAX events.      //      // See org.xml.sax.ContentHandler for all available events.      //      public void startElement( String namespaceURI,          String localName,          String qName,          Attributes attr ) throws SAXException {          if ( foundResult == false ) {             foundResult = (localName.compareTo(                  elementToSearchFor ) == 0);         }     }       public void characters( char[] ch, int start, int length )          throws SAXException {          if ( foundResult ) {             // Read all the data in             result = String.valueOf( ch, start, length );             foundResult = false;         }     }  }                                 
  在上面的类中,您调用 getResult 以获得单个元素结果。对于复杂类型和数组,请根据需要修改这段代码。


  回到顶端

疑难解答
  
<script type="text/javascript">
loadTOCNode(2, 'summary');
</script>
覆盖 Body 序列化可能要花大量的时间并可能出错。请测试您的代理以确保它可以处理 ASP .NET XML Web 服务为您返回的任何内容。


  回到顶端

参考


<script type="text/javascript">
loadTOCNode(1, 'references');
</script>
Java JDK 主页
http://java.sun.com (http://java.sun.com)
Apache SOAP 主页
http://xml.apache.org/soap/ (http://xml.apache.org/soap/)
编写或使用自定义 Apache 序列化程序/反序列化程序
http://xml.apache.org/soap/docs/guide/serializer.html (http://xml.apache.org/soap/docs/guide/serializer.html)
随时为您服务:互操作性测试
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dn_voices_webservice/html/service08152001.asp (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dn_voices_webservice/html/service08152001.asp)
SOAP 生成器的原始布告(并以附件形式提供源代码)
http://groups.yahoo.com/group/soapbuilders/message/5096 (http://groups.yahoo.com/group/soapbuilders/message/5096)


  回到顶端


这篇文章中的信息适用于:

  ·
  Microsoft Visual Studio .NET 2002 专业版


  回到顶端

关键字: 
  kbhowto kbhowtomaster KB308466


  回到顶端

Microsoft 和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何 责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与 该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-327886-1-1.html 上篇帖子: 通向架构师的道路(第三天)之apache性能调优 (转) 下篇帖子: Java RPC通信机制之SOAP:应用Apache Axis进行Web Service开发(转)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表