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:
Microsoft Visual Basic .NET:
这些声明告诉 .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 函数签名与下面类似:
这允许代理用户实例化代理和调用函数,并只需考虑如何处理 SOAP 错误。代理执行下列步骤:
1. | 验证是否已设置了 URL。 |
2. | 准备消息。 |
3. | 发送消息。 |
4. | 分析响应。 |
鉴于 Apache SOAP 2.2 类对消息进行编码的方式,您必须覆盖生成消息正文的代码段以及解释响应的代码段。必须更改处理响应的方式,原因是对 Apache 所做的更改超出了原始 RPC 设计。调用 echoString 的完整代码类似于下面这样:
无论实际参数是简单类型(如字符串)还是复杂类型(如数组),此基本窗体都会正常工作。创建 Body 类更困难。必须手工执行序列化操作。
覆盖 Body 序列化
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script> Apache SOAP 使用一个名为 Body 的类来序列化和反序列化 SOAP 消息。它使用 marshall 和 unmarshall 方法执行上述操作。marshall 方法是实例方法,而 unmarshall 方法是静态类方法。鉴于 Apache SOAP 库的结构和您使用它的方式,您无法从 Body 继承,并且不能期望您自己的 unmarshall 版本被调用。幸好,您可以替换 marshall 并更改序列化 SOAP Body 元素的方式。
要正确地序列化 echoString 方法,请提供您自己的 Body 扩展版本。根据您所拥有的方法的数量,您可以创建一个版本的类来对每个方法扩展 Body,也可以使 marshall 方法根据其他信息选择正确的代码。
假设您只在派生类中序列化一个方法调用,则该类必须包括下列内容:
• | 设置所要序列化的数据的方法。 |
• | 有关如何编写 XML 以便其对于 ASP .NET 终结点具有正确格式的知识。 |
由于 ASP .NET 终结点使用文档/文本编码,因此您只需要写出下面的信息:
• | Body 元素。 |
• | 方法名和相应的名称空间。 |
• | 传入方法中的参数。 |
对于 echoString 示例,该类类似于下面这样:
既然您可以发送消息,那么您还需要能够读取响应。为此,需要一个由 SAX 分析器调用的类。
分析响应
<script type="text/javascript"> loadTOCNode(2, 'summary'); </script> 当消息发出又返回时,您可以确定整个 SOAP 响应。本部分在示例代理的 echoStringtry/catch 块的代码中使用。此 ClientHandler 示例类试图成为可以获取任何一个元素响应的通用类。该类的用户应该能够原封不动地使用它。如果值为 Boolean、日期或数值类型,可以在取得结果后进行转换。更复杂的类型需要更复杂的实现。
要取得简单值,必须执行下面的操作:
在上面的类中,您调用 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和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、