首页 文章

WSO2 ESB 4.7中的Http PassThrough和Http NIO

提问于
浏览
1

我正在将构建为在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

    道歉与迟到的回应 . 您可以修改转换问题,例如:

    <?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而不是使用默认 endpoints . 这也是一种可能的解决方案:

    <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 .

相关问题