2011-02-10 113 views
3

我有一些问题在android项目中使用Ksoap2,同时连接到.net Webservice。 只要我叫Ws witouth参数一切正常,但是当我尝试添加参数时,服务器永远不会得到它们。 这里是我的代码KSoap2 + Android + .net Ws = Null

import java.util.Vector; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.PropertyInfo; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapPrimitive; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.AndroidHttpTransport; 

import android.app.Activity; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class ServicioWeb extends Activity { 

SoapObject response; 

public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    // String NAMESPACE = "http://tempuri.org/"; 
    String NAMESPACE = "IDBN.WS"; 
    String METHOD_NAME = "getClientesByName"; 
    //String SOAP_ACTION = "http://tempuri.org/getClientesByName"; 
    String SOAP_ACTION = "IDBN.WS/getClientesByName"; 
    //String URL = "http://www.ws.idbnar2.com.ar/wsClientes.asmx"; 
    String URL = "http://www.ws.idbnar2.com.ar/wsClientes.asmx"; 
    SoapObject Request = new SoapObject(NAMESPACE, METHOD_NAME); 
    PropertyInfo pi = new PropertyInfo(); 
    pi.setName("Nombre"); 
    pi.setValue("RIQUELME"); 
    pi.setType(int.class); 
    Request.addProperty(pi); 

    SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
    envelope.dotNet = true; 
    envelope.setOutputSoapObject(Request); 
    AndroidHttpTransport androidHttpTransport = new AndroidHttpTransport(URL); 
    ListView Lista = (ListView)findViewById(R.id.Lista); 

    try 
    { 
     androidHttpTransport.call(SOAP_ACTION, envelope); 
     response = (SoapObject)envelope.getResponse(); 
     String[] Clientes = getStringArrayResponse(response, null); 
     Lista.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,Clientes)); 
    } 
    catch(Exception e) 
    { 
     Toast toast = Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG); 
     toast.show(); 
    } 
} 

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) { 
      // don't recurse empty objects 
      if (((SoapObject)obj1).getPropertyCount() > 0) { 
       // recurse into another node to process its nodes/primitives 
       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; 
} 
} 

我harcode服务器端,返回一个字符串+参数我把它..现在我得到它的硬编码部分,好像我添加到肥皂OBJETS是参数永远不会被服务器接收。

Allready尝试: - )不使用“envelope.dotNet = true;”从Webservice 的名称空间中删除“http://”。 - )将该属性直接添加到请求中

任何想法都会产生错误吗?

回答

2

这些行让我困惑:

PropertyInfo pi = new PropertyInfo(); 
pi.setName("Nombre"); 
pi.setValue("RIQUELME"); 
pi.setType(int.class); 
Request.addProperty(pi); 

为什么你使用字符串(“里克尔梅”)作为值的整数?

运行代码时会发生什么?尝试设置envelope.debug = true。尝试设置断点并检查envelope.requestDumpenvelope.responseDump的值。这样你就可以看到发送的内容和收到的内容。

0
pi.setName("Nombre"); 
    pi.setValue("RIQUELME"); 
    pi.setType(int.class); 
    Request.addProperty(pi); 

pi.setValue要么是一个整数(1,2等) OR pi.setType应该string.class

或者,您不需要有pi.setType。如果你删除该行,它应该工作。