WSO2 ESB 4.7中的Http PassThrough和Http NIO

时间:2014-03-23 01:58:29

标签: wso2 wso2esb

我正在将为在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会自动执行手动步骤。我假设这是在消息返回给客户端之前由消息格式化程序完成的。

1 个答案:

答案 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。