2009-12-22 47 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工作得很好。

编辑错字