Android consume WCF , that particular method retur

2019-08-17 23:15发布

问题:

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 ..

回答1:

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 and DataSet are not good choice for interoperable solution. Your passed message looks more like some "deserialization" of XSD (it can be possible because DataTable can transfer its description as part of its serialized data).



回答2:

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);

    PropertyInfo propertyInfo1 = new PropertyInfo();
    propertyInfo1.setName("password");
    propertyInfo1.setValue(password);
    propertyInfo1.setType(String.class);
    request.addProperty(propertyInfo1,password);

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

    envelope.setOutputSoapObject(request);


    SoapObject result = null;

    HttpTransportSE htse = new HttpTransportSE(SOAP_ADDRESS);
    try {

        htse.debug = true;
        htse.call(SOAP_ACTIONLogin, envelope);
        result =(SoapObject) envelope.bodyIn;

    } catch (IOException e){
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (XmlPullParserException e){
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    SoapObject root = (SoapObject) result.getProperty(0);
    SoapObject s_deals = (SoapObject) root.getProperty("diffgram");
    SoapObject s_deals_1 = (SoapObject)s_deals.getProperty("NewDataSet");

    for (int i = 0; i < s_deals_1.getPropertyCount(); i++) {

        Object property = s_deals_1.getProperty(i);
        if (property instanceof SoapObject) {

            SoapObject category_list = (SoapObject)property;

            String EmpID = category_list.getProperty("EmpId").toString();
            String UserName = category_list.getProperty("MstEmpName").toString();
            LoginModel lm=new LoginModel();
            lm.setEmpID(EmpID);
            lm.setUserName(UserName);
            list.add(lm);
            if(list!=null)
            {
                success="valid";
            }
            Log.e("name",UserName);
            Log.e("EmpID",EmpID);


        }   

    }