2010-11-27 15 views
6

Aparentemente, este es un problema bastante experimentado. No estoy seguro de dónde está el problema, o qué necesita ajustarse, pero por mi vida no puedo recuperar nada más que un resultado NULO en mi SoapObject o SoapPrimitive de mi servicio web .NET XML con parámetros.Servicio web Android, KSoap2 y .NET con parámetros = resultado NULO

He intentado todo lo que he encontrado en la red:

  • Adición de la .setXmlVersionTag = sin cambios
  • Usando SoapObject en lugar de SoapPrimitive = sin cambios
  • Usando SoapPrimitive en lugar de SoapObject = ningún cambio
  • Usando HttpTransportSE en lugar de AndroidHttppTransport = ningún cambio
  • Usando AndroidHttpTransport en lugar de HttpTransportSE = ningún cambio
  • Configuración .dotNet = true = ningún cambio
  • Extracción de línea de asignación .dotNet = ningún cambio
  • Extracción de los dos puntos (toda prefijo http: //) del servicio web = ningún cambio
  • Utilización de la clase PropertyInfo en vez de asignación directa = sin cambios
  • el uso de la asignación directa en lugar de la clase PropertyInfo = sin cambios

estoy en una pérdida total y es muy frustrante. Tengo control total del servicio web (lo escribí) por lo que cambios menores, si es útil, estoy dispuesto a intentarlo.

Actualmente mi código de la siguiente manera es la siguiente:

public void GetResults() 
{ 
SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
request.addProperty("lastName", "sm"); 
request.addProperty("middleName", ""); 
request.addProperty("firstName", ""); 
request.addProperty("pageSize", 25); 
request.addProperty("pageNumber", 1); 

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

//AndroidHttpTransport aht = new AndroidHttpTransport(URL); 
HttpTransportSE aht = new HttpTransportSE(URL); 

try 
{ 
    aht.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 
    aht.call(SOAP_ACTION, soapEnvelope);   

    //SoapObject result = (SoapObject)soapEnvelope.bodyIn; 
    SoapObject result = (SoapObject)soapEnvelope.getResponse(); 
    //SoapPrimitive result = (SoapPrimitive) soapEnvelope.getResponse(); 
    //Object result = soapEnvelope.getResponse(); 

    Log.d("WS", String.valueOf(result));   
} 
catch(Exception e) 
{ 
    e.printStackTrace(); 
}  
} 

y mis globales tener este aspecto:

private static final String SOAP_ACTION = "http://yoda/SearchPerson"; 
private static final String METHOD_NAME = "SearchPerson"; 
private static final String NAMESPACE = "http://yoda/"; 
private static final String URL = "http://yoda/ws.asmx"; 

sé 'Yoda' está traduciendo correctamente como mi serivce web no parametrizada es trabajando como un campeón sangriento. (Todo es idéntico excepto las llamadas a 'request.addProperty' que obviamente (una parte o la totalidad) del problema en cuestión.)

Si es importante, escribo esto en una plataforma de destino de 1.6 con KSoap2 2.5.2 y se comporta de forma idéntica en todos mis diferentes emuladores de Android.

He olfateado los paquetes con wireshark y parece que el emulador está enviando las cosas correctas pero los resultados que recibe son siempre NULL. (He probado estos parámetros exactos muchas veces en mi sitio web de prueba que utiliza estos servicios web, y todo funciona perfectamente allí).

Entonces, ¿alguien puede tirarme un hueso aquí?

Gracias,

maguas

EDITAR 2010.11.28:

A pesar de que Wireshark me dice que estoy enviando los parámetros parecería que el servicio web no está recibiendo ellos correctamente, o algo similar.Creé un servicio completamente nuevo que se suponía devolvería una cadena simple, cualquiera que fuera el primer parámetro, con "TEST" al final, codificado desde el propio servicio web.

Bueno, cada vez que ejecuto esto (de Android) obtengo un resultado, y siempre es "PRUEBA". No importa cómo formule SoapEnvelope o pase lo que pase como parámetro, siempre recibo "TEST". Por supuesto, cuando invoco el servicio web en el servidor, funciona como un campeón (y mi resultado es "ESTA ES UNA PRUEBA").

Mi servicio web está en Windows Server 2008 con IIS 7. El grupo de aplicaciones se ejecuta en framework v2.0 (no v4.0) con el modo de canal administrado 'Integrado'.

No tengo idea de dónde está la desconexión. ¿KSoap2 está enviando los parámetros incorrectamente? ¿IIS está configurado incorrectamente? ¿Algo más completamente?

Respuesta

7

Wow. Chalk esto a todo tipo de rarezas y descuidos, pero lo he solucionado.

El problema era la falta de '/' al final del espacio de nombres. NO el espacio de nombre declarado para los globales de Android, sino el espacio de nombres declarado en el servicio web mismo cerca de la parte superior del archivo service.asmx.cs. (Directamente sobre WebServiceBinding).

Una vez que lo agregué al final, todo funcionaba como un campeón.

Por extraño que parezca, esto obviamente afecta ÚNICAMENTE a los métodos que toman los parámetros ya que los métodos sin parámetros funcionaban perfectamente. Y solo con KSoap2 ya que mi sitio web que usa exactamente los mismos servicios funcionaba sin problemas.

1

Puede que esa no sea la respuesta que le gustaría escuchar, pero, en general, si estuviera en su lugar, consideraría cambiar de SOAP (al servicio web de estilo REST, por ejemplo).

Hay millares de artículos críticos de SOAP (WSDL y UDDI), y flotando alrededor - lo que has visto algunos de ellos, como 1, 2, 3 - y, de hecho, son un poco viejo, pero sigue siendo muy cierto Ahora está experimentando exactamente qué es lo que se critica sobre SOAP: complejidad total e incompatibilidad general de varias implementaciones, especialmente multiplataforma.

+0

Tienes toda la razón en ambas áreas. SOAP es anticuado, desafortunadamente no tengo los conocimientos ni la experiencia suficientes en los servicios WCF y REST para realizar la transición. (A menos que, si conoces un tutorial increíble que no he encontrado ...) – Magua

0

en el servicio Web a los que la red del punto ver la siguiente función:

[SoapRpcMethod] 
[WebMethod] 
public Complex GetComplex(string Name) 
{ 
    Complex myObj = new Complex(); 
    if (Name == "" || Name == null) Name = "empty param"; 
    myObj.name = "Return FRom My " + Name; 
    myObj.value = 888; 
    return myObj; 
} 

CUANDO USTED UTILIZA [SoapRpcMethod] debido al retorno de tipo complejo. EN SU JAVA Programe:

SoapObject rpc4 = new SoapObject(serviceNamespace, "GetComplex"); 

rpc4.addProperty("Name", "Johnson TONG"); 

A continuación códigos también están trabajando demasiado

PropertyInfo pi = new PropertyInfo(); 
pi.name= "Name"; 
pi.type = PropertyInfo.STRING_CLASS; 

rpc4.addProperty(pi, "Johnson"); 

int MyCount = rpc4.getPropertyCount(); 
SoapSerializationEnvelope envelope4 = new SoapSerializationEnvelope(SoapEnvelope.VER11); 
envelope4.bodyOut = rpc4; 
envelope4.dotNet = false; // <-- 

No utilice en envelope4.dotNet = true esto siempre pasa valor nulo al servidor por razones que no sé .

envelope4.setOutputSoapObject(rpc4); 
envelope4.addMapping("http://tempuri.org/encodedTypes", "Complex", new Complex().getClass()); 
HttpTransport ht4 = new HttpTransport(serviceUrl); 
ht4.setXmlVersionTag("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); 
ht4.debug = true; 
0

He notado un problema con los parámetros booleanos. Noté que su código no tiene ninguno actualmente, pero esto es solo un aviso. Acabo de cambiar los booleanos a Ints

Cuestiones relacionadas