|
WSDL 配置
WSDL 是 Web 服务已经接受的定义语言,因此可以使用 WSDL 配置 SOAP 节点。可以选择将 WSDL 定义拆分为多个文件。典型的方式是顶级服务定义文件导入绑定文件,绑定文件导入接口文件,然后此接口文件导入或包括模式定义文件。(有关详细信息,请参阅 WSDL 拓扑部分。)如果您确实 使用多文件 WSDL,则必须使用服务定义配置该节点,并允许设置端点属性(如 URL)。(如果您尝试仅使用绑定定义配置节点,则会看到错误消息 Service port: you must select a binding that has at least one port。)在代理中的 WSDL 生命周期部分描述了 WSDL 的总体使用情况。
 | 可部署的 WSDL
SOAP 节点是使用可部署的 WSDL 配置的。这是已导入到消息集或在消息集中生成,然后在工具的目录 Deployable WSDL 下显示的 WSDL。用于可部署 WSDL 的模式定义以独占方式保存在消息集的消息定义中。 |
|
现在重点介绍如何获取配置 SOAP 节点所需的 WSDL 定义。存在以下两种情况:您已经有 WSDL 定义,或者需要创建一个 WSDL 定义。
使用现有的 WSDL
如果有现成的 WSDL 定义,则可以执行下列操作之一:
- 通过单击 New > Message Definition File From > WSDL File 将 WSDL 导入现有消息集。此选项在常规的文件菜单中,也可以通过在 Broker Development 窗格中选择一个消息集,然后通过右键单击该消息集在弹出菜单中找到该选项。注意:这与选择 File > Import
不 同,后者仅允许将 WSDL 文件导入到工作区,而不生成可部署的 WSDL。
- 使用 Quick Start 向导
Start from WSDL and/or XSD
files,您可以通过该向导从头创建消息流和消息集。
注意:WSDL 必须包括绑定定义。某些产品(如 IBM WebSphere Integration Developer)允许您使用仅具有 portType 的 WSDL 定义。您需要将绑定和服务添加到此类定义,然后才能将其导入到代理来创建可部署的 WSDL。
创建新的 WSDL
另外,如果您具有定义 Web 服务消息的有效负载的消息集,则可以从该消息集生成新的 WSDL 定义。通过右键单击您的消息集,然后选择 Generate > WSDL Definition > Generate a new WSDL definition from existing message definitions 可以生成 WSDL。
如果希望仅在外部使用 WSDL,现在可以选择 Export to an external directory。不过,如果想要使用 WSDL 配置 SOAP 节点,则请选择 Create in a workspace directory。注意:您应该选择消息集项目下的消息集文件夹。例如,如果您的消息集项目名为 myMessageSet,则选择 myMessageSet/myMessageSet。(否则,生成的 WSDL 不会显示在 Deployable WSDL 目录下。)
如果还需要让同一 WSDL 对外部工具包可用(例如,与代码生成器一起使用),则首先应在您的消息集中生成 WSDL,然后作为单独步骤导出它。通过右键单击 WSDL,然后选择 Generate > WSDL Definition > Export an existing WSDL definition to another directory 导出 WSDL。然后可以选择所需的文件格式和 WSDL 样式。
注意:此操作与选择 File > Export
不 同,后者只能从工作区复制个别选定文件,并将其粘贴到文件系统,不能生成形式良好的独立 WSDL。
最后,还可以使用向导从头创建新的 WSDL 定义。(可以通过选择 New > Other > Web Services > WSDL 访问此向导。)不过,如果希望使用此选项,请注意生成的 WSDL 不是可部署的 WSDL,因为内联模式定义被添加到 <types> 部分。如果您需要使用此方法创建新的 WSDL 定义,则在创建该定义后,必须作为单独步骤导入它(如上所述)来创建可部署的 WSDL。
WSDL 验证:开发时间
WSDL 验证器将针对 WS-I Basic Profile 检查 WSDL。如果 WSDL 定义与 WS-I 兼容,则导致互操作性问题的可能性会很小。
当 WSDL 导入器或 WSDL 生成器运行时,可自动调用验证器,也可以通过工具(例如,.wsdl 文件上的弹出菜单)手动调用它。通常,您只需验证 WSDL 定义一次,但是,如果修改 WSDL 文件,则应该重新运行验证。(如果在一个多部分 WSDL 中看到文件的 Referenced file contains errors 错误,则应该对引用的文件手动运行验证器,以查看详细信息。)
您可以指定何时运行验证器,以及应使用工具 Preferences (Window > Preferences) 中哪一种兼容级别,如图 1 中所示。
图 1. WSDL 验证首选项
缺省情况下选择 WS-I Attachments Profile (WS-I AP),但是,如果设置为 Ignore compliance,则可以选择使用与不够全面的 Simple SOAP Binding Profile (WS-I SSBP) 兼容的 Require 或 Suggest。(有关 SSBP 的详细信息,请参阅参考资料。)通常,您应保留缺省值,除常规 SOAP 绑定外,该缺省值还允许验证器检查 WSDL 中 MIME(带附件的 SOAP)绑定的遵从性。
可部署的 WSDL 和流配置
导入或生成 WSDL 后,您应具有包含可部署 WSDL 的消息集。这通常会显示在 Deployable WSDL 目录下(图 2 的左侧),但是,如果选中 Hide Categories,则会注意到 Deployable WSDL 目录并不显示(图 2 的右侧)。(“隐藏目录”在缺省情况下是关闭的,但是通过消息集的弹出菜单可以选择它。)
图 2. 可部署的 WSDL
然后可以使用可部署的 WSDL 在消息流中配置 SOAP 节点(SOAPInput、SOAPRequest 或 SOAPAsyncRequest),方法是在 Message Flow Editor 中将 WSDL 从资源面板直接拖到该节点(请参见图 3),或在 Properties 节点的 Basic 选项卡上浏览至 WSDL(图 4)。
图 3. SOAPInput 节点的拖动配置
图 4. 属性配置
您必须始终选择特定的 WSDL 绑定。对于 SOAPRequest 或 SOAPAsyncRequest 节点,还必须始终选择特定操作。
通常,您需要创建自已的消息流,然后配置刚才描述的节点。不过,为方便起见,也可以通过将 WSDL 定义拖动到 Message Flow Editor 的空白画布来创建新的框架消息流。在进行该操作时,还可以选择流的类型(服务提供者或使用者)和该流处理的操作。
当配置节点时,除 WSDL 文件名称本身外,在 Basic 选项卡上还会自动设置 WSDL 派生的其他缺省值,但用户可以改写这些缺省值。
消息集的角色和 WSDL 编辑器
从逻辑上说,WSDL 可配置消息流。但是了解消息集本身的意义也非常重要。无论您导入 WSDL 还是生成 WSDL,消息集都包含表示该 WSDL 描述的 Web 服务消息的 .wsdl 资源和 .mxsd 资源。在开发时,这些消息定义支持使用扩展的 SQL (ESQL) 内容帮助和创建映射。在运行时,它们允许对详细的消息内容进行模式验证。
如果使用 WSDL 编辑器编辑可部署的 WSDL 资源,您会发现可以从 WSDL 的图形 Design 视图导航到由消息集表示的基础 XML 模式定义。
图 5. WSDL 编辑器
图 5 显示了带有以下两个操作的服务:op1 和 op2。XML 模式元素 e11 描述了 op1 的 input 消息。单击 e11 右边的箭头可以打开包含该定义的 .mxsd 中的消息定义编辑器。
 |
术语
-
W3C:万维网联盟 (World Wide Web Consortium),发布 Web 服务标准的机构。
-
SOAP:用于 Web 服务消息的 W3C 标准 XML 消息格式。
-
带附件的 SOAP (SwA):用于需要在其消息中合并附件(例如图像数据)的 Web 服务的 W3C 标准。
-
SOAP 域:用于处理 Web 服务消息的代理域。消息在消息流中使用 SOAP 域逻辑树来表示。
-
Web 服务描述语言 (WSDL):用于描述 Web 服务的 W3C 标准。
-
可部署的 WSDL:用于配置 SOAP 域节点的代理 WSDL 表示形式。可部署的 WSDL 的所有模式定义都包含在代理消息定义中。可以通过导入普通的 WSDL 定义来创建可部署的 WSDL。同样地,可以将可部署的 WSDL 导出为普通 WSDL 以供外部使用。
-
多用途 Internet 邮件扩展(Multipurpose Internet Mail Extensions,MIME):用于包含多个部分的消息的消息格式和用于 SwA 和 MTOM 的基础格式。
-
WS-Addressing:描述如何为消息指定标识和寻址信息的 W3C 规范。此规范提供了相关性机制,并允许两个以上的服务进行交互。
- MQ:IBM WebSphere MQ。
|
|
您可以使用 WSDL 编辑器和消息定义编辑器修改 WSDL 定义(如果需要)。(警告:如果需要进行更新,则应将编辑器的图形视图视为查看器,并使用源视图。如果使用图形视图修改 WSDL,则可以添加在可部署的 WSDL 中不允许的内联模式定义。)
如果更改 WSDL 的 targetNamespace、任何端口的名称、portType、绑定、操作或者样式(rpc 或 document),则必须将 WSDL 重新应用到任何使用它的 SOAP 节点。否则无法将受影响的消息流添加到 BAR 文件(您将看到一条 WSDL 存在错误的消息)。
SOAPInput 和 WSDL
根据预期,以 SOAPInput 节点开头的消息流可以处理绑定中的所有操作,该绑定是在配置节点时选择的。每个 portType 通过 WSDL 端口绑定到特定的端点。此端点信息用于将请求分派给节点,因此应该是唯一的。(如果多个 SOAPInput 节点与同一端点关联,则代理无法知道要分派给哪一个节点。)
每个 SOAPInput 节点由单个 WSDL 文件配置。如果需要实现同一 WSDL 的多个版本,那么只要每个节点都使用不同的统一资源标识符 (URI),您就可以在同一个流中配置多个 SOAPInput 节点。SOAPInput 节点可共享单个 SOAPReply 节点(如果需要),这样可以提高流的可读性。类似地,每个 SOAPInput 节点都使用 HTTP 或 HTTPS,因此,最好不要将安全套按字层 (SSL) 保护的操作和非 SSL 操作混合在同一 portType 中。但是,如果不可避免,您可以使用同一 WSDL 配置两个独立的 SOAPInput 节点,将其中一个定义为使用 HTTP,将另一个定义为使用 HTTPS。
SOAPInput 节点可以从消息有效负载(即 SOAP 主体的第一个子元素的名称和命名空间)确定特定的操作。对于 rpc 样式的 WSDL,应保证有效负载对操作是唯一的,因为它是 WSDL 操作名称本身。但是可以使用同一有效负载为多个操作构造文档样式的 WSDL。(WSDL 验证器警告您在开发时操作不是唯一的。)在这种情况下,必须确保 WSDL 为每个操作定义唯一的 SOAPAction 或 WS-Addressing Action;否则,SOAPInput 节点不能对操作进行区别。
部署
应该将消息流与包含配置了 SOAP 节点的 WSDL 的消息集部署在一起。(事实上,如果需要,您可以先部署消息集,但是将消息流和消息集添加到同一 Broker Archive 文件更容易一些。)然后在运行时,使用消息集验证消息流发送或接收的 Web 服务消息。
如果需要,您可以使用 BAR 文件编辑器(Configure 选项卡)修改个别节点的属性。这特别适用于安全配置。
WSDL 拓扑
正如前面提到的,WSDL 定义由以下四个逻辑部分组成:
可以将这些逻辑部分编写为独立文件(与 import 和 include 语句关联)或单个文件。尽管正在改进支持方式,但是某些产品仍难以导入多文件格式。如果您使用多文件格式,则可以选择为每个文件指定不同的 targetNamespace。通常不建议这样做,因为这会使 WSDL 更难以维护(例如,在代理消息集中将每个文件写入独立目录),并且其他工具可能影响其易用性,同时不能获得任何具体好处。
就 SOAP 节点配置而言,总是需要顶级服务定义。
通常,WSDL 定义包含单个服务定义和单个 portType(该服务提供的逻辑接口)以及一个或多个绑定(逻辑接口的物理实例)。但是,WSDL 定义也可以作为单个接口的变体或多个不同接口而包括多个 portTypes。
绑定定义 use,其形式可以是 document(缺省)或 rpc。如果 use 是 document,那么在 WSDL 中由 XML 模式元素描述 SOAP 有效负载。如果 use 是 rpc,那么 SOAP 有效负载是指定命名空间中的 WSDL 操作名称。
绑定是通过端口定义与服务关联的。通过 WSDL 消息和部分定义,将绑定和 portTypes 与 XML 模式关联。图 6 显示了 WSDL 定义的各部分的关系。
图 6. WSDL 组织
- 端口 1、端口 2、端口 3 和端口 4 在不同的位置提供同一命名服务。
- 端口 2 提供的服务与端口 1 相同(相同的逻辑接口和有线格式)。
- 端口 3 提供的逻辑服务与端口 1 和端口 2 相同(同一逻辑接口),但是绑定不同(例如,端口 3 的绑定可能是 SOAP/MQ,而不是 SOAP/HTTP)。
- 端口 4 具有不同的
portType,表明它支持其他操作集 (opsB)。这可能意味着端口 4 提供同一逻辑接口的变体。例如,您可能需要通过内部网提供比公共网更丰富的服务实现。这还可能意味着端口 4 提供完全不同的接口。
注意:通常应为每个端口配置一个不同的位置。SOAPInput 节点可实现特定的 portType 和绑定,但是应基于端口位置为其分派请求。
代理中的 WSDL 生命周期
以下部分将描述 WSDL 从导入或生成到部署的生命周期。
WSDL 导入或生成
将 WSDL 导入消息集,或者从消息集生成新的 WSDL。在这两种情况下,所得到的结果是消息集可以与 SOAP 域一起使用,意味着消息集包含描述 SOAP 消息(在运行时需要)所需的定义。
将下面的消息定义 (mxsds) 添加到消息集:
- (导入时)与内联和外部引用的
<schema> 定义对应的定义。
- WSDL 使用的 SOAP 版本的 SOAP 信封定义。
- 对于 rpc 样式的 WSDL(rpc 文本或 rpc 编码),消息定义为 rpc 样式的操作和部分名称的定义。
- 对于 rpc 编码的 WSDL,消息定义为适当 SOAP 版本的 SOAP 编码定义。
- SOAP 域树本身的定义 (
SOAP_Domain_Msg)。
在导入 时,WSDL 导入器将 WSDL 深层复制到消息集中:
- 将 WSDL 文件复制到反映 WSDL 目标命名空间目录下的消息集,该命名空间由 WSDL
<definitions> 元素的 targetNamespace 属性定义。
- 保留原始文件名称,除非必须更改它们以避免名称冲突。
- 将
<schema> 定义替换为新创建的消息定义文件的 <xsd:import> 引用。
- 使用 WSDL 验证器根据 WS-I 基本概要验证 WSDL。
在生成 时,WSDL 生成器在消息集中创建新的 WSDL 定义。它是上述导入用例的补充。
WSDL 导出
可以从消息集导出 WSDL,使以前生成的 WSDL 可用于外部使用者或导出以前导入的 WSDL。实际上,通过 WSDL 生成向导可选择此操作。
图 7 总结了导入、生成和导出,并介绍了如何对 WSDL 执行以下操作:
- 导入到消息集。
- 从现有消息集生成(如果也需要供外部应用程序使用,则将其导出)。
在这两种情况下,可以使用在消息集中生成的可部署 WSDL 配置 SOAP 节点。
图 7. WSDL 导入、生成和导出
WSDL 配置
WSDL 用于在消息流中配置 SOAP 节点,使您能够创建与 WSDL 直接相关的消息流,该 WSDL 描述其需要处理的消息。
BAR 文件创建
将包含 WSDL 的消息集添加到 .bar 文件。通常,您可以将消息集及其关联的消息流添加到同一 .bar 文件。如果需要,您可以单独部署 WSDL,但要求在依赖于它的消息流之前 部署它。
BAR 文件部署
将 .bar 文件部署到代理,使消息流能够在运行时根据 WSDL 检查消息,并在逻辑树中提供 WSDL 派生的信息。
图 8 总结了配置、BAR 文件创建和部署,并显示了如何将消息集和消息流部署到代理存档文件中的代理。
图 8. 配置和部署
结束语
本文是系列文章的第 3 部分,向您详细描述了 SOAP 节点的配置和 WSDL 的使用。第 4 部分将描述得到的运行时行为。
|