How to call a WCF service using ksoap2 on android?

34,676

Solution 1

finally I got it to work because the namespace missed a "/" in the end ,

following is my code

package cn.qing.ksop2test;


import java.io.Writer;

import org.ksoap2.*;
import org.ksoap2.serialization.*;
import org.ksoap2.transport.*;
import org.xmlpull.v1.XmlSerializer;

import android.app.Activity;
import android.os.Bundle;
import android.util.Xml;
import android.widget.TextView;

public class ksop2test extends Activity {
/** Called when the activity is first created. */


private static final String METHOD_NAME = "HelloWorldRequest";
//  private static final String METHOD_NAME = "HelloWorld";

private static final String NAMESPACE = "http://tempuri.org/";
//  private static final String NAMESPACE = "http://tempuri.org";

private static final String URL = "http://192.168.0.2:8080/HelloWCF/Service1.svc";
//  private static final String URL = "http://192.168.0.2:8080/webservice1  /Service1.asmx";

final String SOAP_ACTION = "http://tempuri.org/IService1/HelloWorld";
//  final String SOAP_ACTION = "http://tempuri.org/HelloWorld";
TextView tv;
StringBuilder sb;
private XmlSerializer writer;



@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    tv = new TextView(this);
    sb = new StringBuilder();
    call();
    tv.setText(sb.toString());
    setContentView(tv);
}

public void call() {
    try {

        SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

        request.addProperty("Name", "Qing");

        SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
                SoapEnvelope.VER11);
        envelope.dotNet = true;
        envelope.setOutputSoapObject(request);


        HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
        androidHttpTransport.call(SOAP_ACTION, envelope);
        SoapPrimitive result = (SoapPrimitive)envelope.getResponse();

        //to get the data
        String resultData = result.toString();
        // 0 is the first object of data 


        sb.append(resultData + "\n");
        } catch (Exception e) {
        sb.append("Error:\n" + e.getMessage() + "\n");
        }

    }

}

Solution 2

I'm using

private static final String SOAP_ACTION = "http://tempuri.org/IContact/GetContactCount";
private static final String METHOD_NAME = "GetContactCount";
private static final String NAMESPACE = "http://tempuri.org/";
private static final String URL = "http://xxx.xxx.com/Contacts/ContactsService.Contacts.svc";

So maybe the problem is in your SOAP action.

Also is the spelling on your method name correct ie AuthenticatdUser?

Share:
34,676
Qing
Author by

Qing

Updated on July 21, 2022

Comments

  • Qing
    Qing almost 2 years

    Here is my code

    import org.ksoap2.*;
    import org.ksoap2.serialization.*;
    import org.ksoap2.transport.*;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.TextView;
    
    public class ksop2test extends Activity {
     /** Called when the activity is first created. */
    
    
     private static final String METHOD_NAME = "SayHello";
    // private static final String METHOD_NAME = "HelloWorld";
    
     private static final String NAMESPACE = "http://tempuri.org";
    // private static final String NAMESPACE = "http://tempuri.org";
    
     private static final String URL = "http://192.168.0.2:8080/HelloWCF/Service1.svc";
    // private static final String URL = "http://192.168.0.2:8080/webservice1/Service1.asmx";
    
     final String SOAP_ACTION = "http://tempuri.org/IService1/SayHello";
    // final String SOAP_ACTION = "http://tempuri.org/HelloWorld";
     TextView tv;
     StringBuilder sb;
    
    
    
     @Override
     public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      tv = new TextView(this);
      sb = new StringBuilder();
      call();
      tv.setText(sb.toString());
      setContentView(tv);
     }
    
     public void call() {
      try {
    
       SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);
    
       request.addProperty("name", "Qing");
    
       SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(
         SoapEnvelope.VER11);
       envelope.dotNet = true;
       envelope.setOutputSoapObject(request);
    
    
       HttpTransportSE androidHttpTransport = new HttpTransportSE(URL);
       androidHttpTransport.call(SOAP_ACTION, envelope);
       sb.append(envelope.toString() + "\n");//cannot get the xml request send
       SoapPrimitive result = (SoapPrimitive)envelope.getResponse();
    
       //to get the data
       String resultData = result.toString();
       // 0 is the first object of data 
    
    
       sb.append(resultData + "\n");
      } catch (Exception e) {
       sb.append("Error:\n" + e.getMessage() + "\n");
      }
    
     }
    
    }
    

    I can successfully access .asmx service, but when I try to call a wcf service the virtual machine said : Error: expected:END_TAG{http://schemas.xmlsoap.org/soap/envelope/}Body(position:END_TAGhttp://schemas.xmlsoap.org/soap/envelope/}s:Fault>@1:712 in java.io.InputStreamReader@43ba6798

    How to print what the request send?

    Here is the wcf wsdl:

    <wsdl:definitions name="Service1" targetNamespace="http://tempuri.org/">
    
    <wsdl:types>
      <xsd:schema targetNamespace="http://tempuri.org/Imports">
      <xsd:import schemaLocation="http://para-bj.para.local:8080/HelloWCF/Service1.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
      <xsd:import schemaLocation="http://para-bj.para.local:8080/HelloWCF/Service1.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
      </xsd:schema>
    </wsdl:types>
    
    <wsdl:message name="IService1_SayHello_InputMessage">
      <wsdl:part name="parameters" element="tns:SayHello"/>
    </wsdl:message>
    
    <wsdl:message name="IService1_SayHello_OutputMessage">
      <wsdl:part name="parameters" element="tns:SayHelloResponse"/>
    </wsdl:message>
    
    <wsdl:portType name="IService1">
      <wsdl:operation name="SayHello">
        <wsdl:input wsaw:Action="http://tempuri.org/IService1/SayHello" message="tns:IService1_SayHello_InputMessage"/>
        <wsdl:output wsaw:Action="http://tempuri.org/IService1/SayHelloResponse" message="tns:IService1_SayHello_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="SayHello">
       <soap:operation soapAction="http://tempuri.org/IService1/SayHello" 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://para-bj.para.local:8080/HelloWCF/Service1.svc"/>
      </wsdl:port>
    </wsdl:service>
    
    </wsdl:definitions>
    

    It uses <xsd:schema> in tag <wsdl:types> and the asmx uses <s:schema> in tag <wsdl:types> what's the difference?