You are viewing a plain text version of this content. The canonical link for it is here.
Posted to soap-user@ws.apache.org by Oliver Kowalke <ol...@t-online.de> on 2002/02/01 23:52:03 UTC

Problem with namespace before arguments or Bug in Toolkit?

Hello,

I've a little .NET server which adds doubles. The client which uses Apache
SOAP 2.2 call the service with two arguments (doubles).
The envelop form Apache SOAP looks like this:

<?xml version="1.0" encoding="UTF-8" ?>
    <SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
        <SOAP-ENV:Body>
            <ns1:addNumbers xmlns:ns1="http://tempuri.org/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
              <dbl1 xsi:type="xsd:double">1.2</dbl1>
              <dbl2 xsi:type="xsd:double">2.3</dbl2>
        </ns1:addNumbers>
        </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

But .NET doesn't recognize the arguments dbl1 and dbl2. If I change the code
a little bit (declaring Parameter) with adding the ns1 the .Net server can
read the arguments.

<?xml version="1.0" encoding="UTF-8" ?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/1999/XMLSchema">
        <SOAP-ENV:Body>
            <ns1:addNumbers xmlns:ns1="http://tempuri.org/"
SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
              <ns1:dbl1 xsi:type="xsd:double">1.4</ns1:dbl1>
              <ns1:dbl2 xsi:type="xsd:double">3.6</ns1:dbl2>
  </ns1:addNumbers>
 </SOAP-ENV:Body>
</SOAP-ENV:Envelope>

the Apache SOAP Code looks like this:

package addnumbersclient;

import java.io.*;
import java.util.*;
import java.net.*;
import org.w3c.dom.*;
import org.apache.soap.util.xml.*;
import org.apache.soap.*;
import org.apache.soap.encoding.*;
import org.apache.soap.encoding.soapenc.*;
import org.apache.soap.rpc.*;
import org.apache.soap.transport.http.SOAPHTTPConnection;

public class AddDoubles
{
  public static void main( String[] args)
  {
    System.out.println("calling .NET Service");

    URL url = null;

    try
    {
      url = new
URL("http://localhost:8080/AddNumbersServer/AddNumbersServer.asmx");
    }
    catch (Exception e)
    {
      System.out.println(e);
    }

    SOAPMappingRegistry smr = new SOAPMappingRegistry();
    StringDeserializer sd = new StringDeserializer();
    smr.mapTypes( Constants.NS_URI_SOAP_ENC, new QName("", "Result"), null,
null, sd);

    // create the transport and set parameters
    SOAPHTTPConnection st = new SOAPHTTPConnection();

    // build the call.
    Call call = new Call();
    call.setSOAPTransport( st);
    call.setSOAPMappingRegistry( smr);

    call.setTargetObjectURI ("http://tempuri.org/");
    call.setMethodName("addNumbers");
    call.setEncodingStyleURI ( Constants.NS_URI_SOAP_ENC);

  Vector params = new Vector();
  params.addElement( new Parameter("ns1:dbl1", Double.class, "1.4", null) );
<-- here I'm adding 'ns1' to the Parameter name
  params.addElement( new Parameter("ns1:dbl2", Double.class, "3.6", null) );
<-- here I'm adding 'ns1' to the Parameter name
  call.setParams( params);

    Response resp = null;
    try
    {
      resp = call.invoke( url, "http://tempuri.org/addNumbers");
    }
    catch ( SOAPException e)
    {
      System.err.println("Caught SOAPException (" + e.getFaultCode () + "):
" + e.getMessage() );
      return;
    }

    if ( resp == null)
    {
      System.out.println("Response was null");
    }

    // check response
    if ( resp != null && !resp.generatedFault() )
    {
      Parameter ret = resp.getReturnValue();
      Object value = ret.getValue();

      System.out.println(".NET Service Response : " + value);
    }
    else
    {
      Fault fault = resp.getFault();
      System.err.println("Generated fault: ");
      System.out.println("  Fault Code   = " + fault.getFaultCode() );
      System.out.println("  Fault String = " + fault.getFaultString() );
    }
  }
}

What is wrong? I shouldn't specify the namespace 'ns1' because the Toolkit
should do that! Maybe there is an mistake in the code?
with best regards,
Oliver