0

我试图通过 WSO2esb 调用 Web 服务。我的 Web 服务只接受这样的肥皂消息。

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Envelope xmlns:ns1="http://www.webserviceX.NET/ConversionRate/Input" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="C:\Documents and Settings\RoGulk\Desktop\SPM\Envelope.xsd">
    <ns1:Body>
        <ns2:ConversionRate xmlns:ns2="http://www.webserviceX.NET/">
         <ns2:FromCurrency>USD</ns2:FromCurrency>
          <ns2:ToCurrency>USD</ns2:ToCurrency>
        </ns2:ConversionRate>
    </ns1:Body>
</ns1:Envelope>

但问题是当我将输入消息读取到 esb 时,esb 会像这样向我的 meaasage 添加一个额外的包装器

<?xml version='1.0' encoding='utf-8'?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
<ns1:Envelope xmlns:ns1="http://www.webserviceX.NET/ConversionRate/Input">
  <ns1:Body>
    <ns2:ConversionRate xmlns:ns2="http://www.webserviceX.NET/">
      <ns2:FromCurrency>INR</ns2:FromCurrency>
      <ns2:ToCurrency>NAD</ns2:ToCurrency>
    </ns2:ConversionRate>
  </ns1:Body>
</ns1:Envelope>
</soapenv:Body>
</soapenv:Envelope>

我认为可以在调用端点之前使用“应用程序/XML”消息格式化程序来完成。但问题是我不知道如何调用“应用程序/XML”消息格式化程序以及在哪里使用它。* * 请各位大侠帮帮我,谢谢

已编辑

我认为添加我的代理服务配置会有所帮助。

在这我没有使用默认输出序列。而不是我使用名为“currencyFileWriter”的序列,它负责将文件写入输出目录。

这是我的代理服务

<proxy xmlns="http://ws.apache.org/ns/synapse" name="CurrencyProxy" transports="https,http,vfs" statistics="disable" trace="disable" startOnLoad="true">
   <target>
      <inSequence>
         <property name="messageType" value="application/xml" scope="default" type="STRING"/>
         <property name="ContentType" value="application/xml" scope="default"/>
         <log level="custom">
            <property name="MessageType" expression="$axis2:ContentType"/>
         </log>
         <log level="full"/>
         <log level="custom">
            <property name="insequance" value="================================Forwerded to out File writer sequance====================="/>
         </log>
         <send receive="currencyFileWriter" buildmessage="true">
            <endpoint key="CurrencyConverter"/>
         </send>
         <log level="custom">
            <property name="After" value="============================AFTER SEND================"/>
         </log>
         <log level="full"/>
      </inSequence>
   </target>
   <parameter name="transport.PollInterval">5</parameter>
   <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
   <parameter name="transport.vfs.FileURI">file:///C:/test/Orginal1/</parameter>
   <parameter name="transport.vfs.MoveAfterProcess">file:///C:/test/Pass1/</parameter>
   <parameter name="transport.vfs.MoveAfterFailure">file:///C:/test/Failures1/</parameter>
   <parameter name="transport.vfs.FileNamePattern">currencytest.xml</parameter>
   <parameter name="transport.vfs.ContentType">application/xml</parameter>
   <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
   <description></description>
</proxy>

tihs 是我的 CurrencyFilewriter 序列

<sequence xmlns="http://ws.apache.org/ns/synapse" name="currencyFileWriter">
   <log level="custom">
      <property name="sequance" value="=====================RECIVED TO CURRENCYFILEWRITER=========================="/>
   </log>
   <log level="full"/>
   <property name="transport.vfs.ReplyFileName" value="result.xml" scope="default" type="STRING"/>
   <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
   <send>
      <endpoint>
         <address uri="vfs:file:///C:/test/Out1"/>
      </endpoint>
   </send>
</sequence>
4

2 回答 2

1

我使用了以下配置,并在 VFS 文件夹中得到了以下结果。

这是我所做的:

端点配置:

<endpoint xmlns="http://ws.apache.org/ns/synapse" name="CurrencyConverter">
   <address uri="http://www.webservicex.net/CurrencyConvertor.asmx"></address>
</endpoint>

序列配置:

<sequence xmlns="http://ws.apache.org/ns/synapse" name="currencyFileWriter">
   <log level="custom">
      <property name="sequance" value="=====================RECIVED TO CURRENCYFILEWRITER=========================="/>
   </log>
   <log level="full"/>
   <property name="transport.vfs.ReplyFileName" value="result.xml" scope="default" type="STRING"/>
   <property name="OUT_ONLY" value="true" scope="default" type="STRING"/>
   <send>
      <endpoint>
         <address uri="vfs:file:///home/ravi/esb/wso2esb-4.5.1/vfs-temp/Out1"/>
      </endpoint>
   </send>
</sequence>

代理配置:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="CurrencyProxy" transports="https,http,vfs" statistics="disable" trace="disable" startOnLoad="true">
   <target>
      <inSequence>
         <log level="custom">
            <property name="insequance" value="================================Forwerded to out File writer sequance====================="/>
         </log>
         <send>
            <endpoint key="CurrencyConverter"/>
         </send>
         <log level="custom">
            <property name="After" value="============================AFTER SEND================"/>
         </log>
         <log level="full"/>
      </inSequence>
      <outSequence>
         <sequence key="currencyFileWriter"/>
      </outSequence>
   </target>
   <parameter name="transport.vfs.ActionAfterProcess">MOVE</parameter>
   <parameter name="transport.PollInterval">5</parameter>
   <parameter name="transport.vfs.MoveAfterProcess">file:///home/ravi/esb/wso2esb-4.5.1/vfs-temp/Pass1/</parameter>
   <parameter name="transport.vfs.FileURI">file:///home/ravi/esb/wso2esb-4.5.1/vfs-temp/Orginal1/</parameter>
   <parameter name="transport.vfs.MoveAfterFailure">file:///home/ravi/esb/wso2esb-4.5.1/vfs-temp/Failures1/</parameter>
   <parameter name="transport.vfs.FileNamePattern">currencytest.xml</parameter>
   <parameter name="transport.vfs.ContentType">application/xml</parameter>
   <parameter name="transport.vfs.ActionAfterFailure">MOVE</parameter>
   <description></description>
</proxy>

这是从客户端(在我的情况下为 SOAP UI)传递到 ESB 的内容 - 我在这里使用 SOAP 1.2,将命名空间 ns1 指向http://www.w3.org/2003/05/soap-envelope

<?xml version="1.0" encoding="UTF-8"?>
<ns1:Envelope xmlns:ns1="http://www.w3.org/2003/05/soap-envelope" xmlns:ns2="http://www.webserviceX.NET/ConversionRate/Input">

    <ns1:Body>
        <ns2:ConversionRate xmlns:ns2="http://www.webserviceX.NET/">
         <ns2:FromCurrency>USD</ns2:FromCurrency>
          <ns2:ToCurrency>LKR</ns2:ToCurrency>
        </ns2:ConversionRate>
    </ns1:Body>
</ns1:Envelope>

这是 ESB 发送到后端服务的内容:

POST /CurrencyConvertor.asmx?WSDL HTTP/1.1
Content-Type: application/soap+xml; charset=UTF-8; action="urn:mediate"
Accept-Encoding: gzip,deflate
Transfer-Encoding: chunked
Host: localhost:5000
Connection: Keep-Alive
User-Agent: Synapse-HttpComponents-NIO

<?xml version='1.0' encoding='UTF-8'?>
<ns1:Envelope xmlns:ns1="http://www.w3.org/2003/05/soap-envelope" xmlns:ns2="http://www.webserviceX.NET/ConversionRate/Input">
    <ns1:Body>
        <ns2:ConversionRate xmlns:ns2="http://www.webserviceX.NET/">
            <ns2:FromCurrency>USD</ns2:FromCurrency>
            <ns2:ToCurrency>LKR</ns2:ToCurrency>
        </ns2:ConversionRate>
    </ns1:Body>
</ns1:Envelope>

这是 Web 服务返回给 ESB 的内容,也保存在 Out1 文件中:

Cache-Control: private, max-age=0
Content-Length: 380
Content-Type: application/soap+xml; charset=utf-8
Server: Microsoft-IIS/7.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Date: Wed, 23 Jan 2013 15:53:53 GMT


<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <ConversionRateResponse xmlns="http://www.webserviceX.NET/">     
            <ConversionRateResult>127.05</ConversionRateResult>
        </ConversionRateResponse>
    </soap:Body>
</soap:Envelope>

希望这对这个设置有所帮助,我似乎没有遇到您遇到的问题 - ESB 重新包装了请求。:)

于 2013-01-23T16:07:59.850 回答
0

您需要在发送调解器上方(在调用您的端点之前)添加以下属性,以从消息中删除额外的肥皂信封包装器。

<property name="messageType" value="application/xml" scope="axis2" type="STRING"/>

我使用以下示例代理对其进行了测试,它对我有用。

<?xml version="1.0" encoding="UTF-8"?>
    <proxy xmlns="http://ws.apache.org/ns/synapse"
           name="test"
           transports="https,http"
           statistics="disable"
           trace="disable"
           startOnLoad="true">
       <target>
          <inSequence>

             <property name="messageType"
                       value="application/xml"
                       scope="axis2"
                       type="STRING"/>
             <log level="full"/>
             <send>
                <endpoint>
                   <address uri="http://www.google.com"/>
                </endpoint>
             </send>
          </inSequence>
       </target>
       <description/>
    </proxy>

谢谢

于 2016-01-19T08:47:42.733 回答