内容


理解 UDDI 注册中心的 WSDL

如何发布和查找 WSDL 服务描述

Comments

Web 服务描述语言(WSDL)是用于描述 Web 服务的一种 XML 语言,它将 Web 服务描述为一组对消息进行操作的网络端点。一个 WSDL 服务描述包含对一组操作和消息的一个抽象定义,绑定到这些操作和消息的一个具体协议,和这个绑定的一个网络端点规范。

统一描述发现和集成(UDDI)提供一种发布和查找服务描述的方法。UDDI 数据实体提供对定义业务和服务信息的支持。WSDL 中定义的服务描述信息是 UDDI 注册中心信息的补充。UDDI 提供对许多不同类型的服务描述的支持。因此,UDDI 没有对 WSDL 的直接支持, 也没有对任何其它服务描述机制的直接支持。

UDDI 组织,即 UDDI.org,已经发布了一个优化方法文档,标题为 在 UDDI 注册中心 1.05 中使用 WSDL(请参阅 参考资料)。这个优化方法文档描述了关于如何在 UDDI 注册中心发布 WSDL 服务描述的一些元素。本文的目的就是增加这种信息。主要的焦点问题是如何将一个完整的 WSDL 服务描述映射到 UDDI 注册中心,现有的 WSDL 工具和运行时环境要求必须做到这一点。本文中的信息遵守那个优化方法文档中列出的大致过程, 且与 WSDL 1.1、UDDI 1.0 和 UDDI 2.0 规范一致(请参阅 参考资料)。

UDDI 和 WSDL 概述

在描述将 WSDL 服务描述映射到 UDDI 注册中心的过程之前,很重要的一点是要理解 UDDI 数据类型和主要的 WSDL 文档类型。

UDDI 数据类型

在 UDDI 注册中心有 4 种主要的数据类型: businessEntitybusinessServicebindingTemplatetModel图 1展示了所有这些数据类型之间的关系。

图 1. UDDI 数据类型
图 1. UDDI 数据类型
图 1. UDDI 数据类型

businessEntity 提供关于商家的信息,可以包含一个或多个 businessService。 这个商家是服务提供者。Web 服务的技术和业务描述在 businessService 和其 bindingTemplate 中被定义。每个 bindingTemplate 包含一个对一个或多个 tModel 的引用。tModel 被用于定义服务的技术规范。

WSDL 文档类型

为帮助在 UDDI 注册中心发布和查找 WSDL 服务描述,WSDL 文档被分为两种类型: 服务接口(service interface )服务实现(service implementations)(请参阅 图 2)。

图 2. WSDL 文档类型
图 2. WSDL 文档类型
图 2. WSDL 文档类型

服务接口由 WSDL 文档来描述,这种文档包含服务接口的 typesimportmessageportTypebinding等元素。服务接口包含将用于实现一个或多个服务的 WSDL 服务定义。它是 Web 服务的抽象定义,并被用于描述某种特定类型的服务。

通过使用一个 import 元素,一个服务接口文档可以引用另一个服务接口文档。 例如,一个仅包含 message 和 portType 元素的服务接口可以被另一个仅包含此 portType 的绑定的服务接口引用。

WSDL 服务实现文档将包含 importservice元素。服务实现文档包含实现一个服务接口的服务的描述。import 元素中至少会有一个将包含对 WSDL 服务接口文档的引用。一个服务实现文档可以包含对多个服务接口文档的引用。

WSDL 服务实现文档中的 import 元素包含两个属性。 namespace的属性值是一个与服务接口文档中的 targetNamespace相匹配的 URL。 location属性是一个用于引用包含完整的服务接口定义的 WSDL 文档的 URL。port 元素的 binding属性包含对服务接口文档中的某个特定绑定的引用。

服务接口文档由 服务接口提供者开发和发布。服务实现文档由 服务提供者创建和发布。服务接口提供者与服务提供者这两个角色在逻辑上是分离的,但他们可以是同一个商业实体。

发布和查找 WSDL 描述

这一部分描述发布和查找一个完整的 WSDL 服务描述的过程。一个完整的 WSDL 服务描述是由一个服务接口和一个服务实现文档组成的。

由于服务接口表示服务的可重用定义,它在 UDDI 注册中心被作为 tModel 发布。 服务实现描述服务的实例。每个实例都是使用一个 WSDL service 元素定义的。服务实现文档中的每个 service 元素都被用于发布 UDDI businessService。

当发布一个 WSDL 服务描述时,在服务实现被作为 businessService 发布之前,必须将一个服务接口作为一个 tModel 发布。

图 3包含从 WSDL 到 UDDI 的映射概览。我将在下面的部分中对这个映射加以描述。

图 3. 从 WSDL 到 UDDI 的映射概览
图 3. 从 WSDL 到 UDDI 的映射
图 3. 从 WSDL 到 UDDI 的映射

发布服务接口

在 UDDI 注册中心,服务接口被作为 tModel 发布。tModel 由服务接口提供者发布。tModel 中的一些元素是使用来自 WSDL 服务接口描述中的信息构建的。

UDDI tModel

表 1定义创建 tModel 步骤。一个有效的对 WSDL 服务接口定义的 tModel 引用应该是使用 targetNamespace 命名,并且必须包含 overviewURL 和 categoryBag 设置。

表 1: 创建 tModel 的步骤
UDDI tModelWSDL 服务接口描述必需
1namedefinitions 元素的 targetNamespace 属性tModel 名称使用服务接口文档的目标名称空间设置。名称需要一致以确保只使用服务实现文档中的信息就可以定位 tModel。
2descriptiondefinitions 元素中的 documentation 元素tModel description 元素被限制为只能使用 256 个字符。这个元素的英文值可根据 definitions 元素的前 256 个字符设置(documentation 元素与服务接口文档中的 definitions 元素相关联)。如果 documentation 元素不存在,那么应该使用 definitions 元素中的 name 属性。
3overviewURL[服务接口文档 URL 和绑定规范]服务接口文档的位置必须在 overviewURL 元素中设置。如果服务接口文档中有多个绑定,那么必须在 URL 中对绑定进行编码。
4categoryBag[不可用]tModel 的 categoryBag 必须至少包含一个键控的引用。这个键控的引用必须包含一个对 uddi-org:types tModel 的引用,而且键名必须是 wsdlSpec 。这个条目把 tModel 当作一个 WSDL 服务接口定义。

服务接口到 tModel 的映射示例

清单 1包含一个示例 WSDL 服务接口文档。映射到 UDDI tModel 中的值显示在图表关键字中。

清单 1:示例 WSDL 服务接口
<?xml version="1.0"?>
<definitions name="StockQuoteService-interface"
  targetNamespace="http://www.getquote.com/StockQuoteService-interface"
  xmlns:tns="http://www.getquote.com/StockQuoteService-interface"
  xmlns:xsd=" http://www.w3.org/2001/XMLSchema "
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns="http://schemas.xmlsoap.org/wsdl/">
  <documentation>
    Standard WSDL service interface definition for a stock quote service.
  </documentation>
  <message name="SingleSymbolRequest">
    <part name="symbol" type="xsd:string"/>
  </message>
  <message name="SingleSymbolQuoteResponse">
    <part name="quote" type="xsd:string"/>
  </message>
 
  <portType name="SingleSymbolStockQuoteService">
    <operation name="getQuote">
      <input message="tns:SingleSymbolRequest"/>
      <output message="tns:SingleSymbolQuoteResponse"/>
    </operation>
  </portType>
  <binding name="SingleSymbolBinding"
           type="tns:SingleSymbolStockQuoteService">
    <soap:binding style="rpc"
                  transport="http://schemas.xmlsoap.org/soap/http"/>
    <operation name="getQuote">
      <soap:operation soapAction="http://www.getquote.com/GetQuote"/>
      <input>
        <soap:body use="encoded"
            namespace="urn:single-symbol-stock-quotes"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </input>
      <output>
        <soap:body use="encoded"
            namespace="urn:single-symbol-stock-quotes"
            encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"/>
      </output>
    </operation>
  </binding>  
</definitions>

关键字:

Definitions― targetNamespace 将被用作 tModel 的名称。documentation 元素的内容将被用于描述 tModel。
Binding― 绑定名将被用于限定 overviewURL。

清单 2包含在发布 WSDL 服务接口定义时创建的 UDDI tModel。 值显示在图表关键字中。

清单 2:根据 WSDL 服务接口创建的 UDDI tModel
<?xml version="1.0"?>
<tModel tModelKey="">
  <name>http://www.getquote.com/StockQuoteService-interface</name>
  <description xml:lang="en">
    Standard service interface definition for a stock quote service.
  </description>
  <overviewDoc>
    <description xml:lang="en">
      WSDL Service Interface Document
    </description>
    <overviewURL>
      http://www.getquote.com/services/
SQS-interface.wsdl#SingleSymbolBinding
    </overviewURL>
  </overviewDoc>
  <categoryBag>
    <keyedReference tModelKey="UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4"
                    keyName="uddi-org:types" keyValue="wsdlSpec"/>
    <keyedReference tModelKey="UUID:DB77450D-9FA8-45D4-A7BC-04411D14E384" 
                    keyName="Stock market trading services" 
                    keyValue="84121801"/>
  </categoryBag>
</tModel>

关键字:

tModel― tModel 的名称根据 targetNamespace 设置。描述是根据与 definitions 元素相关联的 documentation 元素设置的。overviewURL 被设置为 WSDL 服务接口文档可通过网络访问到的位置, 即 http://www.getquote.com/services/SQS-interface.wsdl。它还包含对服务接口文档中名为的 SingleSymbolBinding 的绑定的直接引用。既然这是服务接口文档中唯一的绑定,对绑定的这个引用就不是必需的。categoryBag 包含 wsdlSpec 条目以及其它的所有 keyedReference,keyedReference 指出这个服务接口描述的意向中的商业用途。

发布服务实现

服务实现在 UDDI 注册中心是作为带有一个或多个 bindingTemplate 的 businessService 发布的。 businessService 由服务提供者发布。

UDDI businessService
将为服务实现文档中定义的每个 service 元素创建一个新的 businessService。 下面的表中包含 businessService 元素列表,这些 businessService 元素可根据 WSDL 服务实现文档的内容创建。

UDDI businessService描述必需
1namebusinessService 的 name 元素根据服务实现文档中的 service 元素的 name 属性设置。
2descriptiondescription 元素根据 service 元素中的 documentation 元素的内容设置。 description 元素的英文值根据与 service 元素关联的 documentation 元素中的前 256 个字符设置。如果 documentation 元素不存在,那么 businessService 的 description 元素就没有被设置。

UDDI bindingTemplate
新的 bindingTemplate 元素是在 businessService 中为 service 元素中定义的每个 port 元素而定义的。

UDDI bindingTemplate描述必需
1description如果 port 元素包含一个 documentation 元素,那么就有一个 description 元素是根据 documentation 元素的前 256 个字符设置的。
2accessPoint对于一个 SOAP 或 HTTP 绑定,accessPoint 是根据与 port 元素关联的扩展元素的 location 属性设置的。 这个元素将包含 URL,且 URLType 属性是根据此 URL 中的协议设置的。 对于不使用 URL 规范的协议绑定,应该使用 URLType 属性指出协议绑定的类型, 并且 accessPoint 元素应该包含一个可用于定位使用指定协议的 Web 服务的值。
3tModelInstanceInfobindingTemplate 将包含自己引用的每个 tModel 的一个 tModelInstanceInfo 元素。至少将有一个 tModelInstanceInfo 元素包含对表示服务接口文档的 tModel 的直接引用。
4overviewURLoverviewURL 元素可能包含对服务实现文档的一个直接引用。对这个文档的引用仅用于提供对人类可读的文档的访问。这个文档中的其它所有信息都应该能够通过 UDDI 数据实体访问。通过维持对原始 WSDL 文档的直接引用,您可以确保被发布的文档就是查找操作返回的那个。 如果这个文档包含多个端口,那么这个元素应该包含对端口名的直接引用。 由于可能会有多个端口引用同一个绑定,只使用 tModel 中的直接引用是不够的。 端口名被指定为 overviewURL 上的片段标识符。片段标识符是 URL 的一个扩展,使用“#”字符作为一个分隔符。

服务实现到 businessService 的映射示例
清单 3包含 WSDL 服务实现文档的一个示例。突出显示的值是将 WSDL 信息映射到 UDDI businessService 和 bindingTemplate 时必需的值。值显示在图表关键字中。

清单 3:WSDL 服务实现示例
<?xml version="1.0"?>
<definitions name="StockQuoteService"
  targetNamespace="http://www.getquote.com/StockQuoteService"
  xmlns:interface="http://www.getquote.com/StockQuoteService-interface"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
  xmlns="http://schemas.xmlsoap.org/wsdl/">
   
  <documentation>
    This service provides an implementation of a standard stock quote service.
    The Web service uses the live stock quote service provided by XMLtoday.com.
    The XMLtoday.com stock quote service uses an HTTP GET interface to request
    a quote, and returns an XML string as a response.
    For additional information on how this service obtains stock quotes, go to
    the XMLtoday.com web site: http://www.xmltoday.com/examples/soap/stock.psp.
  </documentation>
  <import namespace="http://www.getquote.com/StockQuoteService-interface"
     location="http://www.getquote.com/wsdl/SQS-interface.wsdl"/>
  <service name="StockQuoteService">
    <documentation>Stock Quote Service</documentation>
    
    <port name="SingleSymbolServicePort"
        binding="interface:SingleSymbolBinding">
      <documentation>Single Symbol Stock Quote Service</documentation>
      <soap:address location="http://www.getquote.com/stockquoteservice"/>
    </port>
  </service>
</definitions>

关键字:

Service― service 元素的 name 属性被用作 businessService 的名称。service 元素中的 documentation 元素被用于描述 businessService。
Import― 端口名被附加到 overviewURL,此 overviewURL 包含对服务实现文档的引用。服务的位置被用于设置 bindingTemplate 中的 accessPoint。

清单 4包含根据服务实现文档创建的 UDDI businessService 定义。categoryBag 应该包含一个或多个 keyedReference,它们被用于对服务意向中的商业用途进行分类。值显示在图表关键字中。

清单 4:根据 WSDL 服务实现创建的 UDDI 商业服务
      <businessService businessKey="..." serviceKey="...">
  <name>StockQuoteService</name>
  <description xml:lang="en">
   Stock Quote Service
  </description>
  <bindingTemplates>
    <bindingTemplate bindingKey="..." serviceKey="...">
      <description>
        Single Symbol Stock Quote Service
      </description>
      <accesssPoint URLType="http">
       http://www.getquote.com/singlestockquote
      </accessPoint>
      <tModelInstanceDetails>
        <tModelInstanceInfo tModelKey="[tModel Key for Service Interface]">
          <instanceDetails>
            <overviewURL>
              http://www.getquote.com/services/SQS.wsdl
            </overviewURL>
          </instanceDetails>
        </tModelInstanceInfo>
      </tModelInstanceDetails>
    </bindingTemplate>
  </bindingTemplates>
  <categoryBag>
    <keyedReference tModelKey="UUID:DB77450D-9FA8-45D4-A7BC-04411D14E384" 
                    keyName="Stock market trading services" 
                    keyValue="84121801"/>
  </categoryBag>
</businessService>

关键字:

BusinessService― businessService 的 name 根据 WSDL 服务实现文档中的 service 的 name设置。 description 根据 service 元素中的 documentation 元素设置。
BindingTemplate― 它的 description 是根据 port 元素中的documentation 元素设置。accessPoint 根据 soap:address 扩展元素设置。tModelKey 被设置到与服务接口文档关联的 tModel 的 UUID。可使用 import 元素的 namespace 属性对 tModel 进行定位。overviewURL 是服务实现文档的位置。 由于它是这个文档中唯一的引用,它不包含对 SingleServiceQuote 端口的引用。

查找 WSDL 服务接口描述

所有的 WSDL 服务接口在 UDDI 注册中心都是作为 tModel 发布。对这些 tModel 中的每一个都要进行归类,以便将它们标识为 WSDL 服务描述。UDDI find_tModel 消息可用于查找已经分过类的 tModel。使用 UDDI V1.0 API 时, 清单 5中列出的 find_tModel 消息可用于定位所有的 WSDL 服务接口描述。

清单 5:查找 WSDL 服务接口描述
<?xml version="1.0"?>
<find_tModel generic="1.0" xmlns="urn:uddi-org:api">
  <categoryBag>
    <keyedReference tModelKey="UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4"
                    keyName="uddi-org:types" keyValue="wsdlSpec"/>
  </categoryBag>
</find_tModel>

find_tModel 消息将返回一列 tModel 关键字。使用 get_tModelDetail 消息可检索特定的服务接口描述。get_tModelDetail 消息将返回一个 tModel, 比如 清单 2中列出的那个。

在检索了一个 tModel 后,可使用 overviewURL 检索 WSDL 服务接口文档的内容。

可将另外的 keyedReference 添加到 categoryBag 以限制这个查找请求的响应中返回的 tModel 集。 清单 6中的 find_tModel 消息可用于定位使用 WSDL 定义的所有股票报价服务。

清单 6:查找期望的商业用途的 WSDL 服务接口
<?xml version="1.0"?>
<find_tModel generic="1.0" xmlns="urn:uddi-org:api">
  <categoryBag>
    <keyedReference tModelKey="UUID:C1ACF26D-9672-4404-9D70-39B756E62AB4"
                    keyName="uddi-org:types" keyValue="wsdlSpec"/>
    <keyedReference tModelKey="UUID:DB77450D-9FA8-45D4-A7BC-04411D14E384" 
                    keyName="Stock market trading services" 
                    keyValue="84121801"/>
  </categoryBag>
</find_tModel>

查找 WSDL 服务实现描述

WSDL 服务实现在 UDDI 注册中心是作为 businessService 发布的。businessService 将包含一个或多个 bindingTemplate。对 businessService 进行归类,以便将它看作基于 WSDL 的服务描述。使用 UDDI V1.0 API 时,必须找到一个 businessEntity 或一个 businessEntity 集才能使用 businessService 的查找 API。同样地,也必须找到一个 businessService 或一个 businessService 集才能使用查找 API 定位 bindingTemplate。

查找 UDDI businessService
有两种基本方法可用于查找服务描述。使用特定的分类法,UDDI find_service 消息可用于查找服务描述,或者说它可用于查找实现某个特定的服务接口的服务描述。

使用 UDDI V1.0 API 时,可为某个特定的 businessEntity 发出 清单 7中的消息,以便定位股票报价服务实现这个 businessService。可将另外的 keyedReference 添加到 categoryBag 以缩小对此消息的响应中返回的服务描述的范围。

清单 7:查找 WSDL 服务实现描述
<?xml version="1.0"?>
<find_service businessKey="..." generic="1.0" xmlns="urn:uddi-org:api">
  <categoryBag>
   <keyedReference tModelKey="UUID:DB77450D-9FA8-45D4-A7BC-04411D14E384" 
                    keyName="Stock market trading services" 
                    keyValue="84121801"/>
  </categoryBag>
</find_service>

find_service 消息也可用于定位 businessService ― 该 businessService 是某个特定服务接口的实现。 清单 8中的消息包含 find_service 消息的一个示例,它将查找 businessEntity 中的所有 businessService,这个 businessEntity 实现了股票报价服务的服务接口。由于服务接口是用 tModel 来表示,tModelBag 就被用于指定 WSDL 服务接口与股票报价服务相关联的 tModel 关键字。

清单 8:使用 tModelBag 查找 WSDL 服务实现描述
<?xml version="1.0"?>
<find_service businessKey="..." generic="1.0" xmlns="urn:uddi-org:api">
  <tModelBag>
    <tModelKey>[tModel key for WSDL service interface]</tModelKey> 
  </tModelBag>
</find_service>

find_service 消息将返回一列服务关键字。可使用 get_serviceDetail 消息检索 businessService 描述。get_serviceDetail 消息将返回一个 businessService,比如 清单 4中的那个。

检索了一个 businessService 后,可选择某个特定的 bindingTemplate 调用 Web 服务。bindingTemplate 中的 accessPoint 是服务的端点。overviewURL 可用于检索 WSDL 服务实现文档的内容,该文档可能包含关于已实现服务的额外详细信息。

查找 UDDI bindingTemplate
如果 businessService 包含多个 bindingTemplate,可能会很难确定要使用哪个 bindingTemplate。 find_binding 消息可用于定位应该使用的 bindingTemplate。

清单 9包含一条 find_binding 消息,可用它来检索引用特定的 tModel 的 bindingTemplate。可将这个 tModel 与 WSDL 服务接口描述中的特定绑定关联起来。

清单 9:查找 UDDI bindingTemplate
<?xml version="1.0"?>
<find_binding serviceKey="..." generic="1.0" xmlns="urn:uddi-org:api">
  <tModelBag>
    <tModelKey>[tModelKey for WSDL service interface]<tModelKey/>
  </tModelBag>
</find_service>

这条消息将返回一个或多个 bindingTemplate,比如 清单 10中的那个。访问过 bindingTemplate 之后,accessPoint 中列出了 Web 服务的端点。 如果 bindingTemplate 是根据现有的 WSDL 服务实现文档创建的,那么 overviewURL 可能包含一个对这个文档的引用。可访问这个文档获取额外的、人类可读的关于 Web 服务的信息, 这些信息在 UDDI 注册中心找不到。

清单 10:UDDI bindingTemplate
<?xml version="1.0"?>
<bindingTemplate bindingKey="" serviceKey="">
  <accesssPoint URLType="http">
    http://www.getquote.com/singlestockquote
  </accessPoint>
  <tModelInstanceDetails>
    <tModelInstanceInfo tModelKey="[tModel Key for Service Interface]">
      <instanceDetails>
        <overviewURL>
          http://www.getquote.com/services/SQS.wsdl
        </overviewURL>
      </instanceDetails>
    </tModelInstanceInfo>
  </tModelInstanceDetails>
</bindingTemplate>

总结

本文已经描述了在 UDDI 注册中心发布和查找完整的 WSDL 服务描述的过程。WSDL 服务接口描述是作为 UDDI tModel 发布的,而 WSDL 服务实现描述是作为 UDDI businessService 发布的。 图 4提供了从 WSDL 服务接口和服务实现文档到 UDDI 注册中心条目的映射概览。

在本系列的下一篇文章中,我们将讨论在开发者经常遇到的 5 种不同情形下在 UDDI 注册中心使用 WSDL 所需的精确代码。

图 4:从 WSDL 到 UDDI 的映射概览
图 4:从 WSDL 到 UDDI 的映射概览
图 4:从 WSDL 到 UDDI 的映射概览

在本系列的下一篇文章中,我们将对不同的 WSDL 用法个案研究应用本文中描述的过程。 每个用法个案研究都将举例说明应该如何在 UDDI 注册中心发布不同类型的 WSDL 服务描述。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=SOA and web services
ArticleID=22244
ArticleTitle=理解 UDDI 注册中心的 WSDL
publish-date=09012001