I am new to this site & Android, If there are any wrong please indicate me . My problem is in soap response,
This is my Android code:
public static final String APPURL = "http://192.168.1.213:7986/XontService";
private static final String METHOD_NAME = "LoadDownLoadTables";
private static final String NAMESPACE = "http://tempuri.org/";
private static String SOAP_ACTION = "http://tempuri.org/IXontPDAService/LoadDownLoadTables";
try {
response = soap(METHOD_NAME, SOAP_ACTION, NAMESPACE, APPURL);
Log.w("log_tag","*********" + response.getProperty(0).toString());
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
// ksoap2 calling wcf
public SoapObject soap(String METHOD_NAME, String SOAP_ACTION, String NAMESPACE, String URL) throws IOException, XmlPullParserException {
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); //set up request
request.addProperty("strExec", "7437");
request.addProperty("strBusinessUnit", "HHHHH");
SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); //put all required data into a soap envelope
envelope.dotNet = true;
envelope.setOutputSoapObject(request);
AndroidHttpTransport httpTransport = new AndroidHttpTransport(URL);
httpTransport.debug = true;
try{
Log.w("log_tag", " ===========" +SOAP_ACTION.toString() );
Log.w("Log_cat" ,"*********" + envelope.toString());
httpTransport.call(SOAP_ACTION, envelope);
// Log.d("resBundle", String.valueOf(resBundle));
}
catch(Exception e)
{
e.printStackTrace();
}
SoapObject responses = (SoapObject)envelope.getResponse();
return responses;
}
// response processing
public String[] getStringArrayResponse(SoapObject node, Vector<String> strings) {
boolean isFirstCall = false;
if (strings == null) {
isFirstCall = true;
strings = new Vector<String>();
}
int count = response.getPropertyCount();
for (int i = 0; i < count; i++) {
Object obj1 = node.getProperty(i);
if (obj1 instanceof SoapObject) {
if (((SoapObject)obj1).getPropertyCount() > 0) {
getStringArrayResponse((SoapObject)obj1, strings);
}
} else if (obj1 instanceof SoapPrimitive) {
strings.add(((SoapPrimitive)obj1).toString());
}
}
// only make this for the original caller
if (isFirstCall) {
return (String[])strings.toArray(new String[strings.size()]);
}
return null;
}
This is C# method:
public DataTable LoadDownLoadTables(string strExec, string strBusinessUnit)
{
DataTable dtDownload = new DataTable();
try
{
XontPDAServiceDAL vu = new XontPDAServiceDAL();
if (vu.validateExecutive(strBusinessUnit, strExec) == true)
{
DownloadFetchBLL wmd = new DownloadFetchBLL();
dtDownload = wmd.LoadDownLoadTable(strBusinessUnit, strExec);
}
else
{
throw new FaultException("Executive Not Active in the system.");
}
}
catch (FaultException) { }
catch (Exception ex)
{
throw new FaultException("Database Server is Not Responding.");
}
return dtDownload;
}
This is my WSDl
<wsdl:definitions name="XontPDAService" targetNamespace="http://tempuri.org/">
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports"><xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd2" namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd3" namespace="http://schemas.datacontract.org/2004/07/System.Data"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd4" namespace="http://schemas.datacontract.org/2004/07/XONT.Common.Data.PDAServiceBLL"/>
<xsd:import schemaLocation="http://192.168.1.213:7986/XontService?xsd=xsd5"/></xsd:schema>
</wsdl:types>
------
------
<wsdl:operation name="LoadDownLoadTables">
<soap:operation soapAction="http://tempuri.org/IXontPDAService/LoadDownLoadTables" style="document"/><wsdl:input>
<soap:body use="literal"/></wsdl:input>
<wsdl:output><soap:body use="literal"/></wsdl:output>
</wsdl:operation>
and schema file is :
<xs:schema elementFormDefault="qualified" targetNamespace="http://schemas.datacontract.org/2004/07/System.Data" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://schemas.datacontract.org/2004/07/System.Data">
<xs:element name="DataTable" nillable="true">
<xs:complexType>
<xs:annotation>
<xs:appinfo>
<ActualType Name="DataTable" Namespace="http://schemas.datacontract.org/2004/07/System.Data" xmlns="http://schemas.microsoft.com/2003/10/Serialization/" />
</xs:appinfo>
</xs:annotation>
<xs:sequence>
<xs:any minOccurs="0" maxOccurs="unbounded" namespace="http://www.w3.org/2001/XMLSchema" processContents="lax" />
<xs:any minOccurs="1" namespace="urn:schemas-microsoft-com:xml-diffgram-v1" processContents="lax" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
I got following message: AnyType{element=anyType{complexType=anyType{choice=anyType{element=anyType{complexType=anyType{sequence=anyType{element=anyType{}; element=anyType{}; element=anyType{}; element=anyType{}; element=anyType{}; }; }; }; }; }; }; }
Please help me ..
You have to check return type asp .net Data table then check return newDataSet or DocumentElement... if did not return those thing then check web service public static String authentication(String username,String password) { String success = null; ArrayList list=new ArrayList(); SoapObject request = new SoapObject(WSDL_TARGET_NAMESPACE,OPERATION_Login); PropertyInfo propertyInfo = new PropertyInfo(); propertyInfo.setName("username"); propertyInfo.setValue(username); propertyInfo.setType(String.class); request.addProperty(propertyInfo,username);
Do you have control over your WCF service (= can you change it)? If yes change your service to return some array / list of your own custom classes representing rows in your data table and fill these instances from data table in the service operation.
DataTable
andDataSet
are not good choice for interoperable solution. Your passed message looks more like some "deserialization" of XSD (it can be possible becauseDataTable
can transfer its description as part of its serialized data).