0

実装しようとしている簡単なシナリオがありますが、その方法を理解できませんでした。

dame WSDL (以下) を持つ 2 つのサービスがあるとします。

同じ WSDL を公開するが、IntValue の値に基づいて 2 つのバックエンド サービスのいずれかに呼び出しをルーティングするプロキシを WSO2 で作成したいと考えています。

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

その後、プロキシは、対応する (呼び出された) サービスからの応答を返します。


<wsdl:definitions xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsa10="http://www.w3.org/2005/08/addressing" xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy" xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://tempuri.org/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" name="Service1" targetNamespace="http://tempuri.org/">
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="http://localhost/WcfServiceDual_2/Service1.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://localhost/WcfServiceDual_2/Service1.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="http://localhost/WcfServiceDual_2/Service1.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/WcfServiceDual_2"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="IService1_GetData_InputMessage">
<wsdl:part name="parameters" element="tns:GetData"/>
</wsdl:message>
<wsdl:message name="IService1_GetData_OutputMessage">
<wsdl:part name="parameters" element="tns:GetDataResponse"/>
</wsdl:message>
<wsdl:message name="IService1_GetDataUsingDataContract_InputMessage">
<wsdl:part name="parameters" element="tns:GetDataUsingDataContract"/>
</wsdl:message>
<wsdl:message name="IService1_GetDataUsingDataContract_OutputMessage">
<wsdl:part name="parameters" element="tns:GetDataUsingDataContractResponse"/>
</wsdl:message>
<wsdl:portType name="IService1">
<wsdl:operation name="GetData">
<wsdl:input wsaw:Action="http://tempuri.org/IService1/GetData" message="tns:IService1_GetData_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IService1/GetDataResponse" message="tns:IService1_GetData_OutputMessage"/>
</wsdl:operation>
<wsdl:operation name="GetDataUsingDataContract">
<wsdl:input wsaw:Action="http://tempuri.org/IService1/GetDataUsingDataContract" message="tns:IService1_GetDataUsingDataContract_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IService1/GetDataUsingDataContractResponse" message="tns:IService1_GetDataUsingDataContract_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:binding name="BasicHttpBinding_IService1" type="tns:IService1">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
<wsdl:operation name="GetData">
<soap:operation soapAction="http://tempuri.org/IService1/GetData" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
<wsdl:operation name="GetDataUsingDataContract">
<soap:operation soapAction="http://tempuri.org/IService1/GetDataUsingDataContract" style="document"/>
<wsdl:input>
<soap:body use="literal"/>
</wsdl:input>
<wsdl:output>
<soap:body use="literal"/>
</wsdl:output>
</wsdl:operation>
</wsdl:binding>
<wsdl:service name="Service1">
<wsdl:port name="BasicHttpBinding_IService1" binding="tns:BasicHttpBinding_IService1">
<soap:address location="http://localhost/WcfServiceDual_2/Service1.svc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
4

2 に答える 2

0

私は解決策を見つけました:

<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>
于 2013-03-25T16:27:55.287 に答える
0

同じサービスの 2 つのインスタンスをホストしているのはなぜですか?

とにかく、プロキシに含める予定のロジックは非常に単純です。着信リクエストから、評価したいパラメーターを抽出し、そのルートに基づいてリクエストを別のエンドポイントにルーティングします。これにはフィルターメディエーターを使用できます。

于 2013-03-22T16:30:36.027 に答える