Hi Stephen,
Im not entirely sure if this might be the issue but as you are
calling the web service with ws-addressing enabled, could you enable
ws-addressing at the endpoint level of the proxy service as well. Just
add the line <enableAddressing/> within the <address> endpoint element.
Regards,
Dinuka
Stephen Hall wrote:
Hello,
I'm a fairly new user to synapse so please bear with me. After getting sample
150 to work, I tried to set up synapse as a proxy to an existing web service.
The service I am consuming is a .NET service, I had previously written a
client for this service using axis2 with adb binding. My client works fine w/o
using synapse as a proxy. But when I use synapse a SOAPFault is thrown by the
.NET service. I'm not certain if I messed up my configuration of synapse or my
configuration of org.apache.axis2.client.ServiceClient. Below, I've included
the soap envelope sent by axis2, the envelope then sent by synapse, the fault
returned by the .net service, the wsdl, the synapse config, and the setUp
method of a junit test where I configure axis2. I've tried a number of
different things with the axis2 ServiceClient config from explicitly setting an
action to adding proxy properties.
The fault says I mismatch between the action in my header (not sure if thats
soap or http so i included both) but I don't see it?
Any help greatly appreciated
Steve Hall
The message sent to synapse:
POST /soap/CreehanProxy HTTP/1.1
Content-Type: application/soap+xml; charset=UTF-8;
action="http://tempuri.org/IPointOfSale/RetrievePatientInfoWithOrders"
User-Agent: Axis2
Host: localhost:8280
Transfer-Encoding: chunked
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope">
<soapenv:Header>
<wsa:To>http://10.1.90.54:1150/ScriptMedPOSBIOST/PointOfSaleService.svc</wsa:To>
<wsa:MessageID>urn:uuid:BC59F095B67592C3451225137098344</wsa:MessageID>
<wsa:Action>http://tempuri.org/IPointOfSale/RetrievePatientInfoWithOrders</wsa:Action>
</soapenv:Header>
<soapenv:Body>
<ns2:RetrievePatientInfoWithOrders xmlns:ns2="http://tempuri.org/">
<ns2:userId>TEST1</ns2:userId>
<ns2:orderId>665700</ns2:orderId>
<ns2:storeNumber>46</ns2:storeNumber>
</ns2:RetrievePatientInfoWithOrders>
</soapenv:Body>
</soapenv:Envelope>
>From synapse to the .net service:
POST http://10.1.90.54:1150/ScriptMedPOSBIOST/PointOfSaleService.svc HTTP/1.1
Host: localhost:8280
Content-Type: application/soap+xml; charset=UTF-8;
action="http://tempuri.org/IPointOfSale/RetrievePatientInfoWithOrders"
Transfer-Encoding: chunked
Connection: Keep-Alive
User-Agent: Synapse-HttpComponents-NIO
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://www.w3.org/2003/05/soap-envelope"
xmlns:wsa="http://www.w3.org/2005/08/addressing">
<soapenv:Header>
<wsa:To>http://10.1.90.54:1150/ScriptMedPOSBIOST/PointOfSaleService.svc</wsa:To>
<wsa:MessageID>urn:uuid:A87E61F1744D955E0F1224865751760</wsa:MessageID>
<wsa:Action>http://tempuri.org/IPointOfSale/RetrievePatientInfoWithOrders</wsa:Action>
</soapenv:Header>
<soapenv:Body>
<ns2:RetrievePatientInfoWithOrders xmlns:ns2="http://tempuri.org/">
<ns2:userId>TEST1</ns2:userId>
<ns2:orderId>665700</ns2:orderId>
<ns2:storeNumber>46</ns2:storeNumber>
</ns2:RetrievePatientInfoWithOrders>
</soapenv:Body>
</soapenv:Envelope>
The fault:
HTTP/1.1 500 Internal Server Error
Date: Mon, 27 Oct 2008 19:49:38 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Connection: close
Cache-Control: private
Content-Type: application/soap+xml; charset=utf-8
Content-Length: 642
<?xml version="1.0" encoding="utf-8"?>
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"
xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action
s:mustUnderstand="1">http://www.w3.org/2005/08/addressing/fault</a:Action>
</s:Header>
<s:Body>
<s:Fault>
<s:Code>
<s:Value>s:Sender</s:Value>
<s:Subcode>
<s:Value>a:ActionMismatch</s:Value>
</s:Subcode>
</s:Code>
<s:Reason>
<s:Text xml:lang="en-US">The SOAP action specified on the message, '', does
not match the HTTP SOAP Action, 'http://tempuri.org/IPointOfSale/RetrievePatientInfoWithOrders'.
</s:Text>
</s:Reason>
<s:Detail>
<a:ProblemHeaderQName>a:Action</a:ProblemHeaderQName>
</s:Detail>
</s:Fault>
</s:Body>
</s:Envelope>
The WSDL:
<?xml version="1.0" encoding="utf-8"?>
<wsdl:definitions name="PointOfSale" targetNamespace="http://tempuri.org/"
xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata"
xmlns:tns="http://tempuri.org/"
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing"
xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"
xmlns:i0="http://www.creehan.com"
xmlns:wsap="http://schemas.xmlsoap.org/ws/2004/08/addressing/policy"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:msc="http://schemas.microsoft.com/ws/2005/12/wsdl/contract"
xmlns:wsaw="http://www.w3.org/2006/05/addressing/wsdl"
xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/"
xmlns:wsa10="http://www.w3.org/2005/08/addressing"
xmlns:wsx="http://schemas.xmlsoap.org/ws/2004/09/mex">
<wsdl:import namespace="http://www.creehan.com"
location="http://10.1.90.54:1150/scriptmedPOSBIOST/PointOfSaleService.svc?wsdl=wsdl0"/>
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import
schemaLocation="http://10.1.90.54:1150/scriptmedPOSBIOST/PointOfSaleService.svc?xsd=xsd0"
namespace="http://tempuri.org/"/>
<xsd:import
schemaLocation="http://10.1.90.54:1150/scriptmedPOSBIOST/PointOfSaleService.svc?xsd=xsd1"
namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import
schemaLocation="http://10.1.90.54:1150/scriptmedPOSBIOST/PointOfSaleService.svc?xsd=xsd2"
namespace="http://schemas.datacontract.org/2004/07/Creehan.Scriptmed.POS.Business"/>
</xsd:schema>
</wsdl:types>
<wsdl:message name="IPointOfSale_RetrievePatientInfoWithOrders_InputMessage">
<wsdl:part name="parameters" element="tns:RetrievePatientInfoWithOrders"/>
</wsdl:message>
<wsdl:message name="IPointOfSale_RetrievePatientInfoWithOrders_OutputMessage">
<wsdl:part name="parameters"
element="tns:RetrievePatientInfoWithOrdersResponse"/>
</wsdl:message>
<wsdl:message name="IPointOfSale_SubmitPayments_InputMessage">
<wsdl:part name="parameters" element="tns:SubmitPayments"/>
</wsdl:message>
<wsdl:message name="IPointOfSale_SubmitPayments_OutputMessage">
<wsdl:part name="parameters" element="tns:SubmitPaymentsResponse"/>
</wsdl:message>
<wsdl:message name="IPointOfSale_ProcessOrderFulfillment_InputMessage">
<wsdl:part name="parameters" element="tns:ProcessOrderFulfillment"/>
</wsdl:message>
<wsdl:message name="IPointOfSale_ProcessOrderFulfillment_OutputMessage">
<wsdl:part name="parameters" element="tns:ProcessOrderFulfillmentResponse"/>
</wsdl:message>
<wsdl:portType name="IPointOfSale">
<wsdl:operation name="RetrievePatientInfoWithOrders">
<wsdl:input
wsaw:Action="http://tempuri.org/IPointOfSale/RetrievePatientInfoWithOrders"
message="tns:IPointOfSale_RetrievePatientInfoWithOrders_InputMessage"/>
<wsdl:output
wsaw:Action="http://tempuri.org/IPointOfSale/RetrievePatientInfoWithOrdersResponse"
message="tns:IPointOfSale_RetrievePatientInfoWithOrders_OutputMessage"/>
</wsdl:operation>
<wsdl:operation name="SubmitPayments">
<wsdl:input wsaw:Action="http://tempuri.org/IPointOfSale/SubmitPayments"
message="tns:IPointOfSale_SubmitPayments_InputMessage"/>
<wsdl:output wsaw:Action="http://tempuri.org/IPointOfSale/SubmitPaymentsResponse"
message="tns:IPointOfSale_SubmitPayments_OutputMessage"/>
</wsdl:operation>
<wsdl:operation name="ProcessOrderFulfillment">
<wsdl:input wsaw:Action="http://tempuri.org/IPointOfSale/ProcessOrderFulfillment"
message="tns:IPointOfSale_ProcessOrderFulfillment_InputMessage"/>
<wsdl:output
wsaw:Action="http://tempuri.org/IPointOfSale/ProcessOrderFulfillmentResponse"
message="tns:IPointOfSale_ProcessOrderFulfillment_OutputMessage"/>
</wsdl:operation>
</wsdl:portType>
<wsdl:service name="PointOfSale">
<wsdl:port name="PosService_WSHTTP" binding="i0:PosService_WSHTTP">
<soap12:address
location="http://10.1.90.54:1150/scriptmedPOSBIOST/PointOfSaleService.svc"/>
<wsa10:EndpointReference>
<wsa10:Address>http://10.1.90.54:1150/scriptmedPOSBIOST/PointOfSaleService.svc</wsa10:Address>
<Identity
xmlns="http://schemas.xmlsoap.org/ws/2006/02/addressingidentity">
<Upn>LocalService</Upn>
</Identity>
</wsa10:EndpointReference>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
synapse.xml:
<definitions xmlns="http://ws.apache.org/ns/synapse">
<proxy name="CreehanProxy" trace="enable" statistics="enable">
<target>
<endpoint>
<address
uri="http://10.1.90.54:1150/ScriptMedPOSBIOST/PointOfSaleService.svc"/>
</endpoint>
<inSequence>
<log level="full"/>
</inSequence>
<outSequence>
<log level="full"/>
<send/>
</outSequence>
</target>
</proxy>
</definitions>
axis2 programmatic configuration:
public void setUp()
{
String repositoryLocation = "C:/devtools/axis2-1.2/repository";
serviceUrl = "http://10.1.90.54:1150/ScriptMedPOSBIOST/PointOfSaleService.svc";
prxUrl = "http://localhost:8280/soap/CreehanProxy";
try
{
ConfigurationContext ctx = ConfigurationContextFactory
.createConfigurationContextFromFileSystem(repositoryLocation,
null);
stub = new PointOfSaleStub(ctx, null);
client = stub._getServiceClient();
Options options = new Options();
//set soap version
options.setSoapVersionURI(org.apache.axiom.soap.SOAP12Constants.SOAP_ENVELOPE_NAMESPACE_URI);
//do addressing
client.engageModule("addressing");
options.setTo(new EndpointReference(serviceUrl));
//options.setTo(new EndpointReference(prxUrl));
options.setProperty(Constants.Configuration.TRANSPORT_URL, prxUrl);
options.setAction("http://tempuri.org/IPointOfSale/RetrievePatientInfoWithOrders");
/*
HttpTransportProperties.ProxyProperties proxyProperties =
new HttpTransportProperties.ProxyProperties();
URL url = new URL(prxUrl);
proxyProperties.setProxyName(url.getHost());
proxyProperties.setProxyPort(url.getPort());
proxyProperties.setUserName("");
proxyProperties.setPassWord("");
proxyProperties.setDomain("");
options.setProperty(HTTPConstants.PROXY, proxyProperties);
*/
client.setOptions(options);
}
catch (AxisFault e)
{
}
}