WSO2:基于方法param的SOAP服务路由

WSO2:基于方法param的SOAP服务路由,soap,routing,wso2,Soap,Routing,Wso2,我有一个简单的场景,我们一直在尝试实现,但我们不知道如何实现它 假设我们有两个带有dame WSDL的服务(如下) 我们希望在WSO2中创建一个代理,它公开相同的WSDL,但根据IntValue的值将调用路由到两个后端服务之一 IF IntValue = 1 THEN it calls http://localhost/WcfServiceDual_1/Service1.svc ELSE IF IntValue = 2 THEN it calls http://localhos

我有一个简单的场景,我们一直在尝试实现,但我们不知道如何实现它

假设我们有两个带有dame WSDL的服务(如下)

我们希望在WSO2中创建一个代理,它公开相同的WSDL,但根据IntValue的值将调用路由到两个后端服务之一

IF IntValue = 1 THEN it calls
    http://localhost/WcfServiceDual_1/Service1.svc

ELSE IF IntValue = 2 THEN it calls
    http://localhost/WcfServiceDual_2/Service1.svc
之后,代理返回来自相应(被调用)服务的响应



为什么要托管同一服务的两个实例

无论如何,您计划在代理中使用的逻辑非常简单。从传入的请求中,只需提取要计算的参数,并根据该参数将请求路由到不同的端点。您可以使用解决此问题。

我找到了解决方案:

<proxy xmlns="http://ws.apache.org/ns/synapse" name="DualTest" transports="http" statistics="disable" trace="disable" startOnLoad="true">
   <target>
      <inSequence>
         <log level="custom" separator=",">
            <property name="MessageFlow" value="______"/>
         </log>
         <property xmlns:xs="http://schemas.datacontract.org/2004/07/WcfServiceDual_1" xmlns:p="http://tempuri.org/" name="intValue" expression="//p:GetDataUsingDataContract/p:composite/xs:IntValue/text()" scope="default" type="STRING"/>
         <property xmlns:xs="http://schemas.datacontract.org/2004/07/WcfServiceDual_1" xmlns:p="http://tempuri.org/" name="stringValue" expression="//p:GetDataUsingDataContract/p:composite/xs:StringValue/text()" scope="default" type="STRING"/>
         <log level="custom">
            <property name="intValue" expression="$ctx:intValue"/>
            <property name="stringValue" expression="$ctx:stringValue"/>
         </log>
         <log level="custom" separator=",">
            <property name="MessageFlow" value="______"/>
            <property name="MessageFlow" value="\n======================= Sending Request To : Backend ======================="/>
         </log>
         <log level="full" separator=","/>
         <filter source="get-property('intValue')" regex="2">
            <then>
               <log level="custom" separator=",">
                  <property name="IF" value="*****    2"/>
               </log>
               <send>
                  <endpoint>
                     <address uri="http://Win8/WcfServiceDual_2/Service1.svc"/>
                  </endpoint>
               </send>
            </then>
            <else>
               <log level="custom" separator=",">
                  <property name="ELSE" value="*****    1"/>
               </log>
               <send>
                  <endpoint>
                     <address uri="http://Win8/WcfServiceDual_1/Service1.svc"/>
                  </endpoint>
               </send>
            </else>
         </filter>
         <log level="custom" separator=",">
            <property name="MessageFlow" value="______"/>
         </log>
      </inSequence>
   </target>
   <publishWSDL uri="http://localhost/WcfServiceDual_1/Service1.svc?wsdl"/>
   <description></description>
</proxy>

谢谢您提供的信息!我找到了解决办法
<proxy xmlns="http://ws.apache.org/ns/synapse" name="DualTest" transports="http" statistics="disable" trace="disable" startOnLoad="true">
   <target>
      <inSequence>
         <log level="custom" separator=",">
            <property name="MessageFlow" value="______"/>
         </log>
         <property xmlns:xs="http://schemas.datacontract.org/2004/07/WcfServiceDual_1" xmlns:p="http://tempuri.org/" name="intValue" expression="//p:GetDataUsingDataContract/p:composite/xs:IntValue/text()" scope="default" type="STRING"/>
         <property xmlns:xs="http://schemas.datacontract.org/2004/07/WcfServiceDual_1" xmlns:p="http://tempuri.org/" name="stringValue" expression="//p:GetDataUsingDataContract/p:composite/xs:StringValue/text()" scope="default" type="STRING"/>
         <log level="custom">
            <property name="intValue" expression="$ctx:intValue"/>
            <property name="stringValue" expression="$ctx:stringValue"/>
         </log>
         <log level="custom" separator=",">
            <property name="MessageFlow" value="______"/>
            <property name="MessageFlow" value="\n======================= Sending Request To : Backend ======================="/>
         </log>
         <log level="full" separator=","/>
         <filter source="get-property('intValue')" regex="2">
            <then>
               <log level="custom" separator=",">
                  <property name="IF" value="*****    2"/>
               </log>
               <send>
                  <endpoint>
                     <address uri="http://Win8/WcfServiceDual_2/Service1.svc"/>
                  </endpoint>
               </send>
            </then>
            <else>
               <log level="custom" separator=",">
                  <property name="ELSE" value="*****    1"/>
               </log>
               <send>
                  <endpoint>
                     <address uri="http://Win8/WcfServiceDual_1/Service1.svc"/>
                  </endpoint>
               </send>
            </else>
         </filter>
         <log level="custom" separator=",">
            <property name="MessageFlow" value="______"/>
         </log>
      </inSequence>
   </target>
   <publishWSDL uri="http://localhost/WcfServiceDual_1/Service1.svc?wsdl"/>
   <description></description>
</proxy>