Android потребляет WCF, этот конкретный метод возвращает DataTable - PullRequest
0 голосов
/ 06 июля 2011

Я новичок в этом сайте и Android, если есть какие-либо ошибки, пожалуйста, укажите меня.Моя проблема в мыльном ответе,

Это мой код Android:

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

Это метод C #:

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

Это мой 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>

и файл схемы:

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

Я получил следующее сообщение: AnyType {element = anyType {complexType = anyType {choice = anyType {element = anyType {complexType = anyType {sequence= anyType {элемент = anyType {};Элемент = anyType {};Элемент = anyType {};Элемент = anyType {};Элемент = anyType {};};};};};};};}

Пожалуйста, помогите мне ..

Ответы [ 2 ]

1 голос
/ 06 июля 2011

Есть ли у вас контроль над вашей службой WCF (= можете ли вы изменить ее)? Если да, измените ваш сервис, чтобы он возвращал некоторый массив / список ваших собственных пользовательских классов, представляющих строки в вашей таблице данных, и заполнял эти экземпляры из таблицы данных в операции сервиса.

DataTable и DataSet не являются хорошим выбором для совместимого решения. Ваше переданное сообщение больше похоже на некоторую «десериализацию» XSD (это может быть возможно, потому что DataTable может передавать свое описание как часть своих сериализованных данных).

0 голосов
/ 09 января 2015

Вы должны проверить тип возвращаемого значения asp .net Data table, а затем проверить return newDataSet или DocumentElement ... если не вернули эти вещи, то проверьте публичную статическую аутентификацию String веб-службы (String username, String password) {String success = null;ArrayList list = new ArrayList ();Запрос SoapObject = новый SoapObject (WSDL_TARGET_NAMESPACE, OPERATION_Login);PropertyInfo propertyInfo = new PropertyInfo ();propertyInfo.setName ( "имя пользователя");propertyInfo.setValue (имя пользователя);propertyInfo.setType (String.class);request.addProperty (propertyInfo, имя пользователя);

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


        }   

    }
...