日期:2012-09-09  浏览次数:20476 次

摘要:本文概要说明了在通过 SOAP 进行 RPC 调用时当前实际存在的互操作性问题,同时讨论了导致互操作性问题的三个
因素:HTTP 问题、XML 问题和 SOAP 间断性。

目录

简介
什么是 SOAP?
常见的互操作性问题
传输问题
XML 问题
SOAP 问题
后续话题

简介
当前有多种创建应用程序的平台。但每种平台都习惯于使用自身的协议(本质上通常是二进制代码)来实现机器间的集
成。因此,跨平台的应用程序在数据共享方面的能力相当有限。认识到这些限制后,人们一直在致力于建立有关数据格式
和数据交换方面的标准,藉此以实现“不论服务采用何种软件,使用何种硬件,都能够跨越这一传统的界限以 Web 的形式
无缝地将它们集成在一起”这一远景目标。目前,这一目标已迅速发展成为一种新的计算范例。

该目标的核心是互操作性概念,即不同系统能够无缝地进行通信和共享数据。这也是 Web 服务追求的目标。Web 服务是一
种可以用标准 Internet 协议来访问的可编程应用逻辑;从另一个角度来说,Web 服务是有关机器间和应用程序间透明通
信的、借助于 Web 的标准的具体实现。

目前,实现机器间消息传递的 Web 服务技术多种多样,例如简单对象访问协议 (Simple Object Access Protocol,
SOAP)、Web 服务说明语言 (Web Service Description Language, WSDL) 和超文本传输协议 (HyperText Transfer
Protocol, HTTP)。这些消息的复杂程度各不相同,既有简单的方法调用,也有复杂的订单提交。在 Web 服务的功能中,
最一般但又较高级的功能是实现 RPC(远程过程调用)形式的通信(通过 RPC,一台计算机上的程序可以执行另一台计算
机的程序。)本文从实用的角度介绍了在使用 SOAP 进行 RPC 形式的通信时当前常见的互操作性问题,以后还将撰文探讨
有关通过 SOAP、WSDL 以及其它协议传送消息的问题。


图 1:Web 服务路线图:有线协议元素、服务说明和发现

什么是 SOAP?
SOAP 是 Simple Object Access Protocol(简单对象访问协议)的缩写。该协议的当前版本为 1.1,其具体规范发布在下
列站点上: www.w3.org/tr/soap(英文)。SOAP 以 XML 为基础,说明了机器间通信的消息传送格式。此外,它还包括几
个可选部分,用于描述方法调用 (RPC) 和详细说明通过 HTTP 发送 SOAP 消息的方法。(有关 SOAP 和 Web 服务的详细
背景知识,请参见 Web 服务的平台(英文)。)

以下是一个典型的 SOAP 请求(包括 HTTP 标头),它请求名为 EchoString 的 RPC 方法调用,并将一个字符串当作参
数:

POST /test/simple.asmx HTTP/1.1
Host: 131.107.72.13
Content-Type: text/xml; charset=utf-8
Content-Length: length
SOAPAction: "http://soapinterop.org/echoString"

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://soapinterop.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<tns:echoString>
<inputString>string</inputString>
</tns:echoString>
</soap:Body>
</soap:Envelope>

如上所示,该请求将方法名编码为 XML : <tns:echoString>,将字符串参数编码为 <inputString>。它所代表的 C# 方法
类似于以下内容:

public String echoString(String inputString);

以下是来自服务器的响应:

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:tns="http://soapinterop.org/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<tns:echoStringResponse>
<Return>string</Return>
</tns:echoStringResponse>
</soap:Body>
</soap:Envelope>

有关序列化字符串数据类型以及方法调用形状的规则在 SOAP 1.1 的第 5 节和第 7 节 (www.w3.org/tr/soap(英文))
中定义。

常见的互操作性问题
当执行 RPC 形式的 SOAP 消息传送时,可能会因为多种原因导致互操作性问题。有趣的是,许多互操作性问题都不是
SOAP 本身的问题,而是基本传输引擎或 XML 引擎所导致的互操作性问题。也就是说,互操作性问题可能是:

HTTP 问题


XML 问题,或


SOAP 间断性
还应指出的是,这些规范的制定者也有考虑不周的地方,他们有时可能会模棱两可,这样就很难确定唯一正确的行为。

传输问题
XML Web 服务消息的核心在于发送消息的传输机制。当通过 SOAP 进行 RPC 调用时,HTTP 是目前最为常用的传输机制。
这意味着 SOAP 堆栈之间必然存在 HTTP 互操作性问题。

HTTP 互操作性问题的一个简单示例就是 SOAPAction 的使用。SOAPAction 是一种 HTTP 标头,它必须存在于通过 HTTP
传送的 SOAP 消息中。此标头可以赋以多个不同的值,例如:

SOAPAction: "http://tempuri.org/"

SOAPAction 的值虽然可以完全为空,但必须用引号引起来:

SOAPAction:

问题就在这儿:如果服务器要求空值 SOAPAction,有些客户端将无法满足这一要求,因为并非所有 HTTP 客户端 API 都
具有设置空 HTTP 标头值的方法