Web Service 寻址消息交换模式
万维网联盟 (W3C) Web Service 寻址 (WS-Addressing) 规范为 WSDL 1.0 定义的消息交换模式 (MEP) 明确定义了 WS-Addressing 核心属性。本主题对这些 MEP 进行总结并说明每个模式必须具备的 WS-Addressing 属性。
单向 MEP
这种简单的单向消息在 WSDL 1.0 中被定义为仅输入操作。此操作的 WSDL 片段具有以下格式:
<operation name="myOperation">
<input message="tns:myInputMessage"/>
</operation>
客户机应用程序服务器运行时将在单向 WS-Addressing
输入消息的消息头中自动添加下列 WS-Addressing 消息寻址属性 (MAP),以确保符合 WS-Addressing 规范。
提示: 您可以使用 IBM 专有 WS-Addressing 系统编程接口 (SPI) 来覆盖这些值。
使用“W3C XML 信息集”的标记法则来抽取 WS-Addressing MAP 名称 | 单向输入消息的描述 |
---|---|
[action] | 根据所使用的 WS-Addressing 规范版本生成的 WS-Addressing 操作。 |
[reply endpoint] | 指示不需要对此输入消息作出应答的 WS-Addressing 应答端点。此 MAP 的值取决于所使用的 WS-Addressing 规范版本。 |
[message id] | 生成的唯一消息标识。尽管规范并未指定此属性必需,但 WebSphere® Application Server 运行时将自动设置此值。 |
虽然此消息交换的 WSDL 操作未指定任何响应,但是可以将相关消息作为其他消息交换的组成部分来发送。特别是,应用程序可以使用 WS-Addressing 应答端点或故障端点 MAP 对单向消息的目标指示要将相关消息发送至何处。要传播应答端点或故障端点,请使相应的属性与 JAX-WS BindingProvider 对象的请求上下文相关联或者与 JAX-RPC Stub 或 Call 对象相关联(如使用 IBM 专有 Web Service 寻址 SPI 指定和获取消息寻址属性所述)以覆盖缺省值。
双向请求/响应
这是 WSDL 1.1 定义的请求/响应 MEP。操作的响应部分可以被定义为输出消息和/或故障消息。以下 WSDL 代码摘录说明此类操作的定义的各种格式:
<operation name="myOperation">
<input message="tns:myInputMessage"/>
<output message="tns:myOutputMessage"/>
<fault="tns:myFaultMessage"/>
</operation>
<operation name="myOperation">
<input message="tns:myInputMessage"/>
<output message="tns:myOutputMessage"/>
</operation>
<operation name="myOperation">
<input message="tns:myInputMessage"/>
<fault="tns:myFaultMessage"/>
</operation>
应用程序服务器客户机运行时确保出局请求消息的 SOAP 头包含相关的
WS-Addressing 消息信息头。主调应用程序不必设置 WS-Addressing 头。期望获得响应,因此,必须在请求消息中指定应答端点或故障端点。
提示: 在 2005/08 规范中,由于未指定的应答端点将缺省为包含匿名 URI 的端点引用,因此有效。
下表总结产品在缺省情况下对使用了 WS-Addressing 协议的 Web Service
请求设置的 MAP。您可以使用 IBM 专有 WS-Addressing SPI 来覆盖或这些 MAP 或指定其他 MAP。
使用“W3C XML 信息集”的标记法则来抽取 WS-Addressing MAP 名称 | 请求/响应操作的输入消息的描述 |
---|---|
[action] | 根据所使用的 WS-Addressing 规范版本生成的 WS-Addressing 操作。 |
[message id] | 生成的唯一消息标识。 |
下表总结了缺省情况下该产品对 WS-Addressing 响应或故障消息设置的 MAP。
使用“W3C XML 信息集”的标记法则来抽取 WS-Addressing MAP 名称 | 请求/响应操作的输入消息的描述 |
---|---|
[action] | 根据所使用的 WS-Addressing 规范版本生成的 WS-Addressing 操作。 |
[relationship] | 这是一个关系集,它包含与请求消息中传递的消息标识的应答关系。 |
[message id] | 生成的唯一消息标识;尽管规范并未指定此属性必需,但应用程序服务器运行时将自动设置此属性。 |
同步请求/响应
缺省情况下,如果您未使用 IBM 专有 WS-Addressing SPI 来设置应答端点或故障端点,那么将根据所使用的底层协议来返回双向消息的响应部分。特别是,对于 HTTP 请求,将以同步方式在 HTTP 响应中返回响应。

对于 JAX-WS 同步调用而言,如果设置了应答端点或故障端点,那么所设置的端点引用必须使用匿名 URI。如果该端点引用未使用匿名 URI,那么将抛出 javax.xml.ws.WebServiceException 异常。虽然该端点引用使用匿名 URI,但您可以在该端点引用中使用引用参数来确定响应端点或故障端点的目标。
对于 JAX-WS 应用程序而言,您可以通过应用和配置 WS-Addressing 策略类型来指定同步消息交换模式。此交换模式在下列情况下尤其有用:
- 您未启用 WS-Security,或者未使用组装工具来指定应该对 SOAP 消息的 ReplyTo 和 FaultTo 元素进行签名。在这种情况下,JAX-WS 端点有可能被用于向第三方发送消息,从而有可能参与“拒绝服务”攻击。要避免此类攻击,请指定同步消息交换模式并启用 WS-Policy 以使客户机知道此要求。
- JAX-WS 客户机正在通过 NAT 设备进行通信。SOAP 消息的 ReplyTo 或 FaultTo 元素中的 URI 无法通过此类设备进行路由。在这种情况下,客户机必须使用由 WS-Addressing 规范定义的匿名 URI 以及同步消息交换模式。要确保客户机符合这些要求,即使服务器使用 WS-Policy 来请求 ReplyTo 元素包含非匿名 URI 亦如此,请对客户机指定同步消息交换模式。
异步请求/响应
JAX-RPC 1.0 编程模型不允许将异步应答或故障用于双向请求/响应操作。
对于 WebSphere Application Server 上主管的端点而言,对这些端点上控制的请求作出的响应以及这些请求所生成的故障都将按照
WS-Addressing 规范的要求以应答端点或故障端点作为目标。与发出请求的客户机的连接将关闭并发出 HTTP 202 响应。

对于 JAX-WS 异步调用而言,将自动生成应答端点以供 JAX-WS 实现使用。如果您尝试设置应答端点或故障端点,那么将抛出
javax.xml.ws.WebServiceException 异常。
注: 在 Windows 操作系统上,由客户机发送的本地主机名必须可由目标服务进行解析,否则,应答将无法到达客户机应用程序。另外,您可以将客户机配置成以 IP 格式发送其地址,但这样做将使您无法享受到 DHCP 所带来的好处。有关更多信息,请参阅以异步方式调用 JAX-WS Web Service主题。
![[Windows]](../images/windows.gif)
对于 JAX-WS 应用程序而言,您可以通过若干不同方式来指定异步消息交换模式。
- 通过应用并配置 WS-Addressing 策略集。请参阅配置 WS-Addressing 策略主题。
- 通过对客户机请求上下文设置 com.ibm.websphere.webservices.use.async.mep 属性。请参阅异步调用 JAX-WS Web Service 主题。
- 通过使用部署描述符元素、@Addressing 注释、寻址功能或通过在 WSDL 文档中添加 WS-Policy 断言。请参阅为 JAX-WS 应用程序启用 Web Service 寻址支持主题及其子主题。
消息交换模式配置展示在 WSDL 文档中的 WS-Policy 附件中。如果出现下列其中一种情况,那么客户机将能够访问此消息交换模式配置信息:
- 已启用 WS-Policy 共享。
- 未启用 WS-Policy 共享,但:
- 打包的 WSDL(HTTP GET 请求检索时)包含相关策略信息。
- 在代码中使用了 @Addressing 注释。在此情况下,服务器运行时会生成包含WS-Policy 附件的 WSDL 文档。