2009-12-22 4 views
4

J'essaie de me connecter à un service .NET WCF sous Android à l'aide de kSOAP2 (v 2.1.2), mais je reçois toujours une exception fatale chaque fois que j'essaie d'effectuer l'appel de service. J'ai un peu de difficulté à localiser l'erreur et n'arrive pas à comprendre pourquoi cela se produit. Le code que j'utilise est le suivant:Impossible de se connecter au service WCF sur Android

package org.example.android; 

import org.ksoap2.SoapEnvelope; 
import org.ksoap2.serialization.PropertyInfo; 
import org.ksoap2.serialization.SoapObject; 
import org.ksoap2.serialization.SoapSerializationEnvelope; 
import org.ksoap2.transport.HttpTransport; 

import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.content.Intent; 
import android.os.Bundle; 

public class ValidateUser extends Activity { 
    private static final String SOAP_ACTION = "http://tempuri.org/mobile/ValidateUser"; 
    private static final String METHOD_NAME = "ValidateUser"; 
    private static final String NAMESPACE = "http://tempuri.org/mobile/";  
    private static final String URL = "http://192.168.1.2:8002/WebService.Mobile.svc"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState);  
     setContentView(R.layout.validate_user); 

     Intent intent = getIntent(); 

     Bundle extras = intent.getExtras(); 

     if (extras == null) { 
      this.finish(); 
     } 
     String username = extras.getString("username"); 
     String password = extras.getString("password");        

     Boolean validUser = false; 


     try { 
      SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME); 
      PropertyInfo uName = new PropertyInfo(); 
      uName.name = "userName"; 

      PropertyInfo pWord = new PropertyInfo(); 
      pWord.name = "passWord"; 

      request.addProperty(uName, username); 
      request.addProperty(pWord, password); 

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

      HttpTransport androidHttpTransport = new HttpTransport(URL); 
      androidHttpTransport.call(SOAP_ACTION, envelope); // error occurs here 

      Integer userId = (Integer)envelope.getResponse(); 
      validUser = (userId != 0); 
     } catch (Exception ex) { 

     }    
    } 

    private void exit() { 
     this.finish(); 
    } 
} 

EDIT: supprime les anciennes traces de pile. En résumé, le premier problème était le programme étant incapable d'ouvrir une connexion en raison de l'absence de méthodes ou de bibliothèques en raison de l'utilisation de kSOAP2 vanille plutôt que d'une bibliothèque modifiée pour Android (kSOAP2-Android). Le deuxième problème était un problème de paramètres. Dans le manifeste, je ne l'ai pas ajouter le paramètre suivant:

<uses-permission android:name="android.permission.INTERNET" /> 

J'ai maintenant un problème avec le XMLPullParser que je dois comprendre.

12-23 10: 58: 06,480: ERREUR/SOCKETLOG (210): add_recv_stats recv 0

12-23 10: 58: 06,710: WARN/System.err (210): org.xmlpull.v1.XmlPullParserException: Type inattendu (position: END_DOCUMENT null @ 1: 0 à [email protected])

12-23 10: 58: 06,710: WARN/System. err (210): à org.kxml2.i o.KXmlParser.exception (KXmlParser.java:243)

12-23 10: 58: 06,720: WARN/System.err (210): à org.kxml2.io.KXmlParser.nextTag (KXmlParser.java : 1363)

12-23 10: 58: 06,720: WARN/System.err (210): à org.ksoap2.SoapEnvelope.parse (SoapEnvelope.java:126)

12-23 10 : 58: 06.720: WARN/System.err (210): au org.ksoap2.transport.Transport.parseResponse (Transport.java:63)

12-23 10: 58: 06,720: WARN/System.err (210): à org.ksoap2.transport.HttpTransportSE.call (HttpTransportSE.java:100)

12-23 10:58: 06,730: WARN/System.err (210): à org.example.android.ValidateUser.onCreate (ValidateUser.java:68)

12-23 10: 58: 06,730: WARN/System.err (210): à android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1122)

12-23 10: 58: 06,730: WARN/System .err (210): à android.app.ActivityThread.performLaunchActivity (ActivityThread.java:2104)

12-23 10: 58: 06,730: WARN/System.err (210): à android.app .ActivityThread.handleLaunchActivity (ActivityThread.java:2157)

12-23 10: 58: 06,730: WARN/System.err (210): à android.app.ActivityThread.access 1800 $ (ActivityThread.java: 112)

12-23 10: 58: 06,730: WARN/System.err (210): à android.app.ActivityThread $ H.handleMessage (ActivityThread.java:1581)

12 -23 10: 58: 06,730: WARN/System.err (210): à android.os.Handler.dispatchMessage (Handler.java:88)

12-23 10: 58: 06,730: WARN/System.err (210): au android.os.Looper.loop (Looper.java:123)

12-23 10:58 : 06,730: WARN/System.err (210): à android.app.ActivityThread.main (ActivityThread.java:3739)

12-23 10: 58: 06,730: WARN/System.err (210): à java.lang.reflect.Method.invokeNative (native Méthode)

12-23 10: 58: 06,730: WARN/System.err (210): à java.lang.reflect.Method .invoke (Method.java:515)

12-23 10: 58: 06.730: WARN/System.err (210): à com.android.i nternal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:739)

12-23 10: 58: 06,730: WARN/System.err (210): à com.android.internal.os.ZygoteInit .main (ZygoteInit.java:497)

12-23 10: 58: 06,730: WARN/System.err (210): à dalvik.system.NativeStart.main (native Method)

+0

ne suis pas sûr du premier journal, mais dans la seconde log la « erreur inconnue » est d'une SOCKERR_ non gérée dans le code natif.Il devrait y avoir une entrée de logcat juste au-dessus du début de 'erreur de socket inconnue' quelle est cette ligne? –

+0

J'ai édité les journaux pour montrer les 5 lignes au-dessus de l'exception. – illvm

+0

J'étais capable de résoudre l'exception de socket inconnu. Il semble que j'ai négligé (et que j'ignorais) un paramètre que j'ai dû ajouter à mon fichier manifeste. Cela étant: . Maintenant, j'ai une XMLPullParserException que j'ai besoin de comprendre. – illvm

Répondre

0

Ça a marché. Il y avait quelques problèmes comme mentionné ci-dessus avec le fichier Manifest. En plus de cela, les paramètres NAMESPACE, SOAP_ACTION et URL étaient incorrects. Le NAMESPACE a exigé que "uri:" soit pré-ajouté, comme SOAP_ACTION. L'URL devait avoir un point de terminaison spécifié, donc au lieu de http://192.168.1.2:8002/WebService.Mobile.svc, il devait être http://192.168.1.2:8002/WebService.Mobile.svc/Mobile. Problèmes de connexion résolus, juste besoin de comprendre la chose de transport de données maintenant.

+2

Vous avez mentionné que vous deviez ajouter 'uri:' à l'espace de noms. Votre espace de noms final ressemblait donc à: private static final Chaîne NAMESPACE = "uri: //tempuri.org/mobile/"; Serais-tu en mesure de poster ton code définitif? – Kyle

1

eu le même problème et trouvé ceci: http://code.google.com/p/ksoap2-android/issues/detail?id=35

Voir les commentaires 15 et 17.

Ils suggèrent que vous enveloppez l'appel à "androidHttpTransport.call (soap_action, enveloppe);" dans try/catch et réessayez en cas d'erreur.

OU

Définissez la propriété du système "http.keepAlive" à "false". Plus tard, dans ce numéro, quelqu'un suggère l'utilisation de "KeepAliveHttsTransport". Pour moi, le (j'avoue que c'est sale) essayer/attraper fonctionnait très bien.

typo EDIT

Questions connexes