### 用 WSDL 定义 Web 服务

在 Web 服务的世界里，应用程序基本上由远程的、XML 驱动的组件构成，这些组件采用不同的语言编写，再采用标准的远程激活协议通过 Web 连接。服务提供者定义所提供服务需要用到的数据格式。同样的，当你在以上应用模式下接受 Web 服务时，你也需要采取措施保证你的客户程序采用了服务器期望的数据格式。这正是 WSDL（Web 服务定义语言）大显身手的地方。
WSDL 概述
WSDL 就是描述 XML Web 服务的标准 XML 格式，WSDL 由 Ariba、Intel、IBM 和微软等开发商提出。它用一种和具体语言无关的抽象方式定义了给定 Web 服务收发的有关操作和消息。就其定义来说，你还不能把 WSDL 当作一种对象接口定义语言，例如，CORBA 或 COM 等应用程序体系结构就会用到对象接口定义语言。 WSDL 保持协议中立，但它确实内建了绑定 SOAP 的支持，从而同 SOAP 建立了不可分割的联系。所以，当我在这篇文章中讨论 WSDL 的时候，我会假定你把 SOAP 作为了你的通讯协议。
WSDL 协议已经被提交给了 Internet 标准组织 W3C 审批，目前还处于“确认提交”状态。W3C 维持着正规的标准化系统同时提交提案必须经过确定的一套批准过程才能最终成为官方协议。在这种情况下，WSDL 的地位，照外行看，至少标准组织在考虑让其成为将来可能标准中的一部分。如果你对这方面的情况感兴趣，或碰巧是一位特关心结果的“失眠症患者”，那么你不妨到 W3C 网站上去读读有关的建议标准。
用 WSDL 说明服务
作为一种基于 XML 的标准，如果你对 XML 具有一定的了解，那么 WSDL 的结构对你就不会陌生了。WSDL 文档由服务用来描述数据类型的一组元素、服务可以收到的“消息”以及关联每条消息的 SOAP 绑定组成。
清单 A 就是一份简单的 WSDL 文档，该文档同 W3C 网站公布的 WSDL 示范文本是一样的，它说明了一种股票行情服务（这也是相当标准的一种 Web 服务）。
再仔细阅读清单 A，你可以看到，文档首先以标准的 XML 头开头，其中包含了一个版本标识，而文档的根元素则被称为 definitions。
Definitions 元素可以采用若干种可选属性，这些属性说明文档同时定义文档其余部分使用的名称空间（namespace）。在这种情况下，定义被分配了一个名字（StockQuote），某些名称空间定义是根据以下常规前缀缩写制定的：
tns—“this namespace”的缩写，包含被定义服务的主名称空间
xsdl—XML Schema (XSD)名称空间，用于定义文档中的类型
soap—SOAP 绑定采用的名称空间
接下来，为了定义服务的接口需要在 type 元素内定义所需要的任何复杂类型。这里你必须注意使用标准的 XSD 句法（属性），它是创造数据类型定义最为适合的方法。不过，如果你愿意，WSDL 也能扩展使用不同的类型定义系统。
消息概述
按 WSDL 的用法，消息可以是传递给某一服务公布对象上的方法的任何参数或者方法被调用之后的任何返回结果。为了继续使用股票行情这个 Web 服务例子，单一定义方法多半如以下伪代码所示：
floatgetLastTradePrice(string tickerSymbol)
这样，就像你从清单 A 所看到的那样，文档中定义了两条消息，一条代表方法的输入参数 tickerSymbol（GetLastTradePriceInput 消息）另一条代表该方法的返回值（GetLastTradePriceResult 消息）——最新的股票价格。
操作把消息组织到一起而且抽象地代表方法定义。在我们的例子中，这两条消息都在 GetLastTradePrice 操作元素下的 getLastTradePrice 对象方法定义中组织起来。在一个 WSDL 文件中的所有操作又都挨个在 portType 元素内分组。
WSDL 文档的余下部分采用服务器上的侦听端点（binding 元素）绑定消息同时把端口定义同单一服务实体（service 元素）组合起来。清单 A 的例子就定义了通过 SOAP 采用服务所需要的绑定。
WSDL 工具
你可以手工创建 WSDL 文件，不过，你还可以采用相当多的工具通过 WSDL 来为你自动处理和定义 Web 服务。推荐工具软件如下：
Omniopera—一图形用户界面的 WSDL、XML 和 XSD 编辑器
Microsoft 的 SOAP Toolkit—一种工具包，其中包括根据 WSDL 定义创建 COM 接口的向导程序，还包括根据 COM 接口创建 WSDL 的向导程序
IBM 的 Web Services Toolkit—一种工具包，其中包括产生 WSDL 和 SOAP 部署说明的向导程序