2010-11-27 86 views
6

Apparemment, il s'agit d'un problème assez fréquent. Je ne suis pas sûr de l'origine du problème ou de ce qui doit être ajusté, mais pour la vie de moi, je ne peux rien récupérer d'autre qu'un résultat NULL à mon SoapObject ou à SoapPrimitive à partir de mon service Web XML .NET avec paramètres.Service Web Android, KSoap2 et .NET w/parameters = résultat NULL

J'ai essayé tout ce que j'ai trouvé sur le net:

  • Ajout du .setXmlVersionTag = pas de changement
  • En utilisant SoapObject au lieu de SoapPrimitive = aucun changement
  • En utilisant SoapPrimitive au lieu de SoapObject = aucun changement
  • en utilisant HttpTransportSE au lieu de AndroidHttppTransport = aucun changement
  • en utilisant AndroidHttpTransport au lieu de HttpTransportSE = aucun changement
  • Réglage .dotnet = true = pas de changement
  • Retrait ligne d'affectation .dotnet = pas de changement
  • Retrait du côlon (ensemble préfixe http: //) du service Web = pas de changement
  • En utilisant à la place la classe PropertyInfo d'affectation directe = pas de changement
  • Utiliser l'affectation directe au lieu de la classe PropertyInfo = pas de changement

Je suis à une perte totale et il est assez frustrant. J'ai le contrôle total du service web (je l'ai écrit) donc des changements mineurs, si utile, je suis prêt à essayer.

Actuellement mon code comme suit est la suivante:

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

et mes GLOBALS ressembler à ceci:

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

Je sais 'yoda' est traduit correctement mon serivce web non-paramétrés est travaillant comme un champion sanglant. (Tout est identique sauf les appels 'request.addProperty' qui sont évidemment (en tout ou en partie) du problème.)

Si c'est important, j'écris ceci sur une plate-forme cible 1.6 avec KSoap2 2.5.2 et il se comporte de manière identique sur tous mes différents émulateurs Android. J'ai reniflé les paquets avec wireshark et l'émulateur semble envoyer le bon truc mais les résultats qu'il reçoit sont toujours NULL. (J'ai testé ces paramètres à plusieurs reprises sur mon site Web de test qui utilise ces services Web, et tout fonctionne parfaitement là-bas.)

Alors, quelqu'un peut-il me jeter un os ici?

Merci,

Maguá

EDIT 2010.11.28:

Même si Wireshark me dit que j'envoie les paramètres, il semblerait que le service Web ne reçoit pas les correctement, ou quelque chose de similaire.J'ai créé un tout nouveau service supposé renvoyer une chaîne simple, quel que soit le premier paramètre, avec "TEST" à la fin, codé en dur à partir du service web lui-même.

Eh bien, chaque fois que je lance ceci (depuis Android), j'obtiens un résultat, et c'est toujours "TEST". Peu importe comment je formule le SoapEnvelope ou peu importe ce que je passe en paramètre, je reçois toujours "TEST". Bien sûr, lorsque j'appelle le service web sur le serveur, il fonctionne comme un champion (et mon résultat est "C'EST UN TEST").

Mon service Web est sur Windows Server 2008 avec IIS 7. Le pool d'applications s'exécute sur le framework v2.0 (et non sur v4.0) avec le mode de pipeline géré «Integrated».

Je ne sais pas où se trouve la déconnexion. KSoap2 envoie-t-il les paramètres incorrectement? IIS est-il mal configuré? Quelque chose d'autre entièrement?

Répondre

7

Wow. Craie celui-ci à toutes sortes de bizarreries et de oublis, mais je l'ai réparé.

Le problème était le '/' final manquant à la fin de l'espace de noms. PAS l'espace de noms déclaré pour les globals Android, mais l'espace de noms déclaré sur le service Web lui-même près du haut du fichier service.asmx.cs. (Directement au-dessus de WebServiceBinding). Une fois que je l'ai ajouté à la fin, tout fonctionnait comme un champion.

Assez curieusement, cela affecte évidemment les méthodes qui prennent les paramètres car ces méthodes sans paramètres fonctionnaient parfaitement. Et seulement avec KSoap2 comme mon site Web qui utilise exactement les mêmes services fonctionnait parfaitement.

1

Cela pourrait ne pas être la réponse que vous aimeriez entendre, mais, en général, si j'étais à votre place, je envisagerais de passer de SOAP (au service Web de style REST, par exemple).

Il y a des myriades d'articles critiques à l'égard SOAP (et WSDL et UDDI) flottant autour - vous avez probablement vu certains d'entre eux, comme 1, 2, 3 - et, en fait, ils sont un peu vieux, mais toujours très vrai. Vous expérimentez maintenant exactement ce qui est critiqué par SOAP - complexité totale et incompatibilité générale de diverses implémentations - en particulier multiplate-forme.

+0

Vous avez absolument raison dans les deux zones. SOAP est archaïque, malheureusement je ne connais pas assez les services WCF et REST pour faire la transition. (Sauf si vous connaissez un tutoriel incroyable que je n'ai pas trouvé ...) – Magua

0

En vous DOT NET SERVICE WEB voir la fonction ci-dessous:

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

QUAND VOUS UTILISEZ [SoapRpcMethod] à cause du retour de type complexe. DANS VOTRE JAVA Programe:

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

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

Ci-dessous les codes travaillent aussi trop

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

Ne jamais utiliser envelope4.dotNet = true ce sera toujours passer la valeur null au serveur pour une raison que je ne sais pas .

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

J'ai remarqué un problème avec params booléens. J'ai remarqué que votre code n'en a pas actuellement, mais c'est juste un avertissement. Je viens de changer les booléens à ints