Android, KSoap2 e .NET Web Service w/ parametri = NULL risultato

A quanto pare questo è un abbastanza spesso vissuto il problema. Non sono sicuro del tutto dove sta il problema, o ciò che deve essere modificato, ma per la vita di me non riesco a recuperare qualcosa di diverso da un risultato NULLO per il mio SoapObject o SoapPrimitive dal mio .NET XML web service con parametri.

Ho provato di tutto, ho trovato in rete:

  • Aggiunta di la .setXmlVersionTag = nessun cambiamento
  • Utilizzando SoapObject invece di SoapPrimitive = nessun cambiamento
  • Utilizzando SoapPrimitive invece di SoapObject = nessun cambiamento
  • Utilizzando HttpTransportSE invece di AndroidHttppTransport = nessun cambiamento
  • Utilizzando AndroidHttpTransport invece di HttpTransportSE = nessun cambiamento
  • Impostazione .dotNet = true = nessun cambiamento
  • Rimozione .dotNet riga di assegnazione = nessun cambiamento
  • Rimozione del colon (intera HTTP://prefisso) dal web service = non cambia
  • Utilizzando PropertyInfo posto la classe di assegnazione diretta = nessun cambiamento
  • Mediante assegnazione diretta invece di classe PropertyInfo = nessun cambiamento

Io sono ad una perdita totale ed è abbastanza frustrante. Ho un controllo totale del servizio web (l’ho scritto) così piccole modifiche, se utile, io sono disposto a tentare.

Attualmente il mio codice come segue è questa:

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

e il mio globals simile a questa:

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

So ‘yoda’ sta traducendo correttamente come il mio senza parametri di web serivce sta lavorando come un sanguinoso champ. (Il tutto è identico salva la richiesta.addProperty’ le chiamate che sono ovviamente di parte (o tutto) il problema a portata di mano.)

Se è importante sto scrivendo questo contro un 1.6 piattaforma di destinazione con KSoap2 2.5.2 e si comporta in modo identico in tutti i miei diversi emulatori Android.

Ho annusato i pacchetti con wireshark e l’emulatore sembra essere l’invio di un corretto roba, ma i risultati che riceve sono sempre NULL. (L’ho provato questi parametri esatti molte volte contro il mio sito web di test che utilizza questi servizi web, e tutto funziona perfettamente.)

Così, qualcuno mi passi un osso qui?

Grazie,

Magua

MODIFICA 2010.11.28:

Anche se Wireshark mi dice che io sono l’invio di parametri, sembra che il web service di non ricevere correttamente, o qualcosa di simile. Ho creato un nuovo servizio che è stato supponiamo di restituire una stringa semplice, qualunque sia il primo parametro è stato, con “TEST” alla fine, codificato dal servizio web.

Bene, ogni volta che ho eseguito questa (da Android) ottengo un risultato, ed è sempre “TEST”. Non importa come formulare la SoapEnvelope o qualunque cosa gli passi come parametro, ricevo sempre “TEST”. Naturalmente, quando invoco il servizio web sul server funziona come un campione (e il mio risultato è “QUESTO È UN TEST”).

Mio web service si trova su Windows Server 2008 con IIS 7. L’applicazione è in esecuzione il pool contro framework v2.0 (v4.0) con “Integrato” gestito modalità di pipeline.

Non ho idea di dove la disconnessione si trova. È KSoap2 invio i parametri in modo improprio? IIS è configurato in modo non corretto? Qualcosa di completamente diverso?

OriginaleL’autore Magua | 2010-11-27

5 Replies
  1. 8

    Wow. Gesso questo fino a tutti i tipi di stranezze e le sviste, ma ho risolto.

    Che il problema era il finale mancante ‘/’ alla fine dello spazio dei nomi. NON lo spazio dei nomi dichiarato per Android globals, ma lo spazio dei nomi dichiarato il Web Service stesso vicino il top del servizio.asmx.cs file. (Direttamente sopra WebServiceBinding).

    Una volta l’ho aggiunto alla fine, tutto funzionava come un campione.

    Stranamente, questo, ovviamente, riguarda SOLO i metodi che parametri come questi metodi senza parametri sono stati perfettamente funzionante. E solo con KSoap2 come il mio sito web che utilizza le stesse servizi funzionava perfettamente.

    Perfetto, questo era esattamente il mio problema. Nel mio caso, i numeri interi sono stati lasciando la mia app come valori validi e di arrivare al mio servizio web come zeri.

    OriginaleL’autore Magua

  2. 1

    Che potrebbe non essere la risposta che si desidera ascoltare, ma, in genere, se fossi nei tuoi panni, mi piacerebbe prendere in considerazione di commutazione distanza dal SAPONE (per stile REST web service, per esempio).

    Ci sono miriadi di articoli di criticare SOAP e WSDL e UDDI) fluttuante in giro, probabilmente avete visto alcuni di loro, come Uno, Due, Tre – e, in effetti, sono un po ‘ vecchio, ma ancora molto vero. Stai vivendo ora, esattamente qual è il SAPONE di essere criticato molto su – assoluta complessità e generale di incompatibilità di varie implementazioni soprattutto cross-platform.

    Sei assolutamente corretto in entrambe le aree. Il SAPONE è antiquato, purtroppo io non sono esperto o abbastanza esperienza su WCF REST e servizi per rendere la transizione di sicurezza. (A meno che non se siete a conoscenza di un fantastico tutorial non ho trovato…)

    OriginaleL’autore GreyCat

  3. 0

    In Voi DOT NET WEB SERVICE vedere la funzione riportata di seguito:

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

    QUANDO SI UTILIZZA [SoapRpcMethod] a causa del ritorno di tipo Complesso.
    IN JAVA Gratis:

    SoapObject rpc4 = new SoapObject(serviceNamespace, "GetComplex");
    
    rpc4.addProperty("Name", "Johnson TONG");

    Di seguito i codici sono anche troppo

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

    Non usare mai envelope4.dotNet = true questo sarà sempre passando valore null
    per il Server per il motivo che non so.

    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;

    OriginaleL’autore Johnson TONG

  4. 0

    Ho notato un problema con l’operatore booleano params.
    Ho notato che il codice non ha attualmente, ma questo è solo un testa a testa.
    Ho appena cambiato le booleane per int

    OriginaleL’autore Faizan Kazi

Lascia un commento