我正在将为在WSO2 ESB 4.0上运行而构建的服务迁移到WSO2 ESB 4.7并遇到问题。我正在迁移的服务是带有SOAP 1.2绑定接口的自定义代理。此代理对基于SOAP 1.1的服务进行出站调用。
ESB 4.0服务器正在使用Http NIO传输,并且传输将使用消息格式化程序(我猜测)在发送响应消息时管理SOAP 1.1和1.2之间的ESB中的SOAP消息转换回到客户端。
ESB 4.7使用的是Http PassThrough传输,它没有SOAP消息转换功能,因此必须按顺序手动更改SOAP信封命名空间和HTTP头信息。
是否可以将Http PassThrough和Http NIO配置为在同一ESB上处于活动状态并将各个服务配置为使用其中一个?我已经尝试过,并且没有成功,到目前为止,我的研究似乎表明了其中一种。
EDIT1 - 对RaviU的回应:
谢谢RaviU。如果将ESB 4.7.0配置为使用HTTP NIO传输,则它将支持自动将SOAP 1.1转换为1.2。换句话说,它的行为类似于ESB 4.0服务器。当ESB 4.7.0配置为使用HttpPassThrough传输时,似乎不会自动将SOAP 1.1转换为1.2。这是有道理的,因为传输不关心内容类型。使用HttpPassThrough时遇到的问题是我必须手动将SOAP信封更改为1.2并在发送回客户端之前设置相应的http标头。这是因为当服务调用SOAP 1.1服务时它们会被更改。如果我使用HTTP NIO传输,则ESB会自动执行手动步骤。我假设这是在消息返回给客户端之前由消息格式化程序完成的。
答案 0 :(得分:0)
对迟到的回应道歉。您可以修改转换问题,例如:
<?xml version="1.0" encoding="UTF-8"?>
<proxy xmlns="http://ws.apache.org/ns/synapse"
name="TestProxy"
transports="https,http"
statistics="disable"
trace="disable"
startOnLoad="true">
<target>
<inSequence>
<filter xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
source="namespace-uri(/*)"
regex="http://www.w3.org/2003/05/soap-envelope">
<then>
<property name="incomingSOAPVersion" value="soap12"/>
</then>
<else>
<property name="incomingSOAPVersion" value="soap11"/>
</else>
</filter>
<log level="custom">
<property name="SOAP_VERSION_LOG" expression="$ctx:incomingSOAPVersion"/>
</log>
<send>
<endpoint>
<address uri="http://localhost:8280/services/echo.echoHttpSoap11Endpoint"
format="soap11"/>
</endpoint>
</send>
</inSequence>
<outSequence>
<filter source="$ctx:incomingSOAPVersion" regex="soap11">
<then>
<send>
<endpoint>
<default format="soap11"/>
</endpoint>
</send>
</then>
<else>
<send>
<endpoint>
<default format="soap12"/>
</endpoint>
</send>
</else>
</filter>
</outSequence>
</target>
<publishWSDL uri="http://localhost:8280/services/echo?wsdl"/>
<description/>
</proxy>
您也可以设置messageType而不是使用默认端点。这也是一种可能的解决方案:
<sequence xmlns="http://ws.apache.org/ns/synapse" name="soapVersion">
<filter xmlns:ns="http://org.apache.synapse/xsd" source="$axis2:messageType" regex="application\/soap\+xml">
<then>
<property name="incomingSOAPVersion" value="soap12"/>
</then>
<else>
<property name="incomingSOAPVersion" value="soap11"/>
</else>
</filter>
</sequence>
要么应该工作,但第二个解决方案应该稍微好一点,因为它不评估xPath。