2009-12-22 59 views
4

我想使用kSOAP2(v 2.1.2)連接到Android中的.NET WCF服務,但每當我嘗試進行服務調用時都會收到致命異常。我在查找錯誤時遇到了一些困難,並且似乎無法弄清楚爲什麼會發生這種情況。我使用的代碼如下:無法連接到Android上的WCF服務

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

編輯:刪除舊的堆棧跟蹤。總之,第一個問題是由於使用vanilla kSOAP2而不是Android的修改庫(kSOAP2-Android),程序由於缺少方法或庫而無法打開連接。第二個問題是設置問題。在清單中沒添加以下設置:

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

我現在有與我需要弄清楚XMLPullParser的問題。

10月12日至23日:58:06.480: ERROR/SOCKETLOG(210):add_recv_stats 的recv 0

10月12日至23日:58:06.710: WARN/System.err的(210): org.xmlpull.v1.XmlPullParserException: 意外類型(位置:END_DOCUMENT 空@ 1:0在 [email protected]

十月12日至23日:58:06.710: WARN /系統。 err(210):at org.kxml2.i o.KXmlParser.exception(KXmlParser.java:243)

10月12日至23日:58:06.720: WARN/System.err的(210):在 org.kxml2.io.KXmlParser.nextTag(KXmlParser.java :1363)

10月12日至23日:58:06.720: WARN/System.err的(210):在 org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:126)

10月12日至23日:58:06.720: WARN/System.err(210):at 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)

10月12日至23日:58:06.730: WARN/System.err的( 210):at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1122)

12-23 10:58:06.730: WARN/System .ERR(210):在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2104)

10月12日至23日:58:06.730: WARN/System.err的(210):在 android.app .ActivityThread.handleLaunchActivity(ActivityThread.java:2157)

10月12日至23日:58:06.730: WARN/System.err的(210):在 android.app.ActivityThread.access $ 1800(ActivityThread。的java:112)

10月12日至23日: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)

10月12日至23日:58:06.730: WARN/System.err(210):at android.os.Looper.loop(Looper.java:123)

12-23 10:58 :06.730: WARN/System.err的(210):在 android.app.ActivityThread.main(ActivityThread.java:3739)

10月12日至23日:58:06.730: WARN/System.err的(210 ):在 java.lang.reflect.Method.invokeNative(母語 方法)

十月12日至23日: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):at com.android.i nternal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:739)

10月12日至23日:58:06.730: WARN/System.err的(210):在 com.android.internal.os.ZygoteInit 。主要(ZygoteInit.java:497)

10月12日至23日:58:06.730: WARN/System.err的(210):在 dalvik.system.NativeStart.main(母語 方法)

+0

不能確定第一個日誌,但在第二日誌「未知錯誤」是從未處理SOCKERR_在本地代碼。應該有一個logcat條目剛剛開始'未知的套接字錯誤'是什麼行? – 2009-12-23 02:04:43

+0

我編輯了日誌以顯示異常之上的5行。 – illvm 2009-12-23 15:46:46

+0

我能解決未知套接字異常。似乎我忽略了(而且很無知)我必須添加到我的清單文件中的設置。那是: 。現在我有一個XMLPullParserException,我需要弄清楚。 – illvm 2009-12-23 15:55:06

回答

0

得到了這個工作。 Manifest文件中有上面提到的一些問題。最重要的是,NAMESPACE,SOAP_ACTION和URL參數不正確。 NAMESPACE需要「uri:」作爲前綴,就像SOAP_ACTION一樣。 URL需要指定一個端點,而不是http://192.168.1.2:8002/WebService.Mobile.svc它需要是http://192.168.1.2:8002/WebService.Mobile.svc/Mobile。解決了連接問題,現在只需要弄清楚數據傳輸的問題。

+2

你提到你必須在命名空間添加'uri:'。你的最終命名空間如下所示: private static final String NAMESPACE =「uri://tempuri.org/mobile/」; 你能發佈你的最終代碼嗎? – Kyle 2011-10-11 15:08:59

1

有同樣的問題,發現這個:http://code.google.com/p/ksoap2-android/issues/detail?id=35

看評論15和17

他們認爲你包調用 「androidHttpTransport.call(SOAP_ACTION,信封);」在try/catch中輸入 ,並在出現錯誤時再試一次。

OR

設置系統屬性 「http.keepAlive」 爲 「假」。

後來在那個問題上有人建議使用「KeepAliveHttsTransport」。

對我來說,(我承認它很髒)try/catch工作得很好。

編輯錯字

相關問題