12.6. 在拒绝模式中使用 HTTP 传输
概述
在普通的 HTTP 请求/响应场景中,请求和响应使用相同的 HTTP 连接发送。服务提供商处理请求并响应包含适当 HTTP 状态代码和响应内容的响应。如果是成功请求,HTTP 状态代码将设为 200。
在某些情况下,比如使用 WS-RM,或者请求执行延长的时间,因此分离请求和响应消息是合理的。在这种情况下,服务提供程序通过 HTTP 连接的后端通道将消费者发送 202 Accepted 响应到消费者,后者上接收了请求。然后,它会处理请求,并使用新的解除服务器→client HTTP 连接将响应发回到消费者。使用者运行时收到传入的响应,并在返回到应用代码之前将其与适当的请求相关联。
配置分离交互
以分离模式使用 HTTP 传输需要您执行以下操作:
配置使用者以使用 WS-Addressing。
将使用者配置为使用分离端点。
请参阅 “配置使用者”一节。
配置消费者与之交互的任何服务提供商,以使用 WS-Addressing。
配置端点以使用 WS-Addressing
指定使用者和任何服务提供程序使用 WS-Addressing。
您可以通过以下两种方式之一指定端点使用 WS-Addressing:
添加
wswa:UsingAddressing
元素到端点的 WSDL端口
元素,如 例 12.19 “使用 WSDL 激活 WS-Addressing” 所示。例 12.19. 使用 WSDL 激活 WS-Addressing
... <service name="WidgetSOAPService"> <port name="WidgetSOAPPort" binding="tns:WidgetSOAPBinding"> <soap:address="http://widgetvendor.net/widgetSeller" /> <wswa:UsingAddressing xmlns:wswa="http://www.w3.org/2005/02/addressing/wsdl"/> </port> </service> ...
将 WS-Addressing 策略添加到端点的 WSDL
端口
元素,如 例 12.20 “使用策略激活 WS-Addressing” 所示。例 12.20. 使用策略激活 WS-Addressing
... <service name="WidgetSOAPService"> <port name="WidgetSOAPPort" binding="tns:WidgetSOAPBinding"> <soap:address="http://widgetvendor.net/widgetSeller" /> <wsp:Policy xmlns:wsp="http://www.w3.org/2006/07/ws-policy"> <wsam:Addressing xmlns:wsam="http://www.w3.org/2007/02/addressing/metadata"> <wsp:Policy/> </wsam:Addressing> </wsp:Policy> </port> </service> ...
WS-Addressing 策略取代了 wswa:UsingAddressing
WSDL 元素。
配置使用者
使用 http-conf:conduit
元素的 DecoupledEndpoint
属性,将消费者端点配置为使用分离的端点。
例 12.21 “将 Consumer 配置为使用已拒绝的 HTTP 端点” 显示设置 例 12.19 “使用 WSDL 激活 WS-Addressing” 中定义的端点的配置,以使用分离端点。用户现在收到所有响应 http://widgetvendor.net/widgetSellerInbox。
例 12.21. 将 Consumer 配置为使用已拒绝的 HTTP 端点
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:http="http://cxf.apache.org/transports/http/configuration" xsi:schemaLocation="http://cxf.apache.org/transports/http/configuration http://cxf.apache.org/schemas/configuration/http-conf.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <http:conduit name="{http://widgetvendor.net/services}WidgetSOAPPort.http-conduit"> <http:client DecoupledEndpoint="http://widgetvendor.net:9999/decoupled_endpoint" /> </http:conduit> </beans>
如何处理消息
在分离模式下使用 HTTP 传输会增加对 HTTP 消息处理的额外复杂性。虽然为应用程序中的实施级别代码增加了复杂性是透明的,但了解调试原因可能很重要。
图 12.1 “拒绝 HTTP 传输中的消息流” 显示在分离模式下使用 HTTP 时的信息流。
图 12.1. 拒绝 HTTP 传输中的消息流
请求启动以下进程:
- 使用者实施调用操作,并且生成请求消息。
WS-Addressing 层将 WS-A 标头添加到消息中。
当在消费者配置中指定分离端点时,分离端点的地址会被放在 WS-A ReplyTo 标头中。
- 邮件将发送到服务供应商。
- 服务提供商收到消息。
- 来自消费者的请求消息被分配到提供商的 WS-A 层。
- 由于 WS-A ReplyTo 标头没有设置为 anonymous,因此提供商会向一个 HTTP 状态代码发回一个消息,确认已接收了请求。
- HTTP 层使用原始连接的 back-channel 将 202 Accepted 消息发回给消费者。
使用者收到用于发送原始消息的 HTTP 连接后端频道的 202 Accepted 回复。
当消费者收到 202 Accepted 回复时,HTTP 连接将关闭。
- 请求传递到处理请求的服务提供商的实现。
- 当响应就绪时,它将被分配给 WS-A 层。
- WS-A 层将 WS-Addressing 标头添加到响应消息中。
- HTTP 传输将响应发送到消费者的解除端点。
- 消费者分离的端点接收来自服务提供商的响应。
- 响应被分配给消费者的 WS-A 层,它使用 WS-A RelatesTo 标头与正确的请求相关联。
- 关联的响应将返回到客户端实施,调用调用被取消阻塞。