`
aries211
  • 浏览: 60250 次
  • 性别: Icon_minigender_1
  • 来自: 宁波
最近访客 更多访客>>
社区版块
存档分类
最新评论

HOW TO:将 Apache SOAP 2.2 客户程序与 .NET XML Web 服务集成

    博客分类:
  • RJY
阅读更多
<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

<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 服务本身提供名称空间以外,不做任何事情。

回到顶端

回到顶端

要求

<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和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、


评论

相关推荐

    asp.net知识库

    将 ASP.NET 2.0 应用程序服务配置为使用 SQL Server 2000 或 SQL Server 2005 ASP.NET 2.0 中的数据源控件 使用 ASP.NET 2.0 ObjectDataSource 控件 ASP.NET 2.0 的内部变化 使用SQL Cache Dependency 代替 ...

    php.ini-development

    should be disabled, as enabling it may result in issues when generating XML ; documents, however this remains supported for backward compatibility reasons. ; Note that this directive does not control...

    Ajax Starter Kit

    Create and consume Web services with SOAP and RESTAvoid common errors and troubleshoot programs Use popular Ajax libraries to speed up and improve common programming tasks On the CD… XAMPP for ...

    PHP5 完整官方 中文教程

    PDO Driver How-To Extension FAQs Zend Engine 2 API reference Zend Engine 1 The future: PHP 6 and Zend Engine 3 FAQ — FAQ:常见问题 一般信息 邮件列表 获取 PHP 数据库问题 安装 — 安装常见问题 编译问题 ...

    PHP5中文参考手册

    PDO Driver How-To Extension FAQs Zend Engine 2 API reference Zend Engine 1 The future: PHP 6 and Zend Engine 3 FAQ — FAQ:常见问题 一般信息 邮件列表 获取 PHP 数据库问题 安装 — 安装常见问题 编译问题 ...

    PHP手册2007整合中文版

    54. PDO Driver How-To 55. Extension FAQs 56. Zend Engine 2 API reference 57. Zend Engine 1 58. The future: PHP 6 and Zend Engine 3 VIII. FAQ:常见问题 59. 一般信息 60. 邮件列表 61. 获取 PHP 62. 数据库...

    PHP官方手册中文版

    54. PDO Driver How-To 55. Extension FAQs 56. Zend Engine 2 API reference 57. Zend Engine 1 58. The future: PHP 6 and Zend Engine 3 VIII. FAQ:常见问题 59. 一般信息 60. 邮件列表 61. 获取 PHP ...

    PHP5 开发手册 简体中文手册

    45. PDO Driver How-To 46. Zend API:深入 PHP 内核 47. 扩展 PHP 3 VIII. FAQ:常见问题 48. 一般信息 49. 邮件列表 50. 获取 PHP 51. 数据库问题 52. 安装常见问题 53. 编译问题 54. 使用 PHP 55. PHP 和 HTML 56...

    php帮助文档,php。chm,php必备的中文手册

    45. PDO Driver How-To 46. Zend API:深入 PHP 内核 47. 扩展 PHP 3 VIII. FAQ:常见问题 48. 一般信息 49. 邮件列表 50. 获取 PHP 51. 数据库问题 52. 安装常见问题 53. 编译问题 54. 使用 PHP 55. PHP 和 HTML 56...

    JavaEE 5.0 Tutorial.pdf

    XML .............................................................................................................................................. 51 SOAP Transport Protocol .............................

Global site tag (gtag.js) - Google Analytics