我正在尝试使用kSOAP2(v 2.1.2)连接到Android中的.NET 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)而由于缺少方法或库而无法打开连接。第二个问题是设置问题。在Manifest中我没有添加以下设置:
<uses-permission android:name="android.permission.INTERNET" />
我现在遇到了XMLPullParser的问题,我需要弄清楚。
12-23 10:58:06.480: ERROR / SOCKETLOG(210):add_recv_stats recv 0
12-23 10:58:06.710: WARN / System.err的(210): org.xmlpull.v1.XmlPullParserException: 意外类型(位置:END_DOCUMENT null @ 1:0 in java.io.InputStreamReader@433fb070)
12-23 10:58:06.710: WARN / System.err(210):at org.kxml2.io.KXmlParser.exception(KXmlParser.java:243)
12-23 10:58:06.720: WARN / System.err(210):at org.kxml2.io.KXmlParser.nextTag(KXmlParser.java:1363)
12-23 10:58:06.720: WARN / System.err(210):at org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:126)
12-23 10: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):at org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:100)
12-23 10:58:06.730: WARN / System.err(210):at org.example.android.ValidateUser.onCreate(ValidateUser.java:68)
12-23 10: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):at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2104)
12-23 10:58:06.730: WARN / System.err(210):at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2157)
12-23 10:58:06.730: WARN / System.err(210):at android.app.ActivityThread.access $ 1800(ActivityThread.java:112)
12-23 10:58:06.730: WARN / System.err(210):at android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1581)
12-23 10:58:06.730: WARN / System.err(210):at android.os.Handler.dispatchMessage(Handler.java:88)
12-23 10: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):at android.app.ActivityThread.main(ActivityThread.java:3739)
12-23 10:58:06.730: WARN / System.err(210):at java.lang.reflect.Method.invokeNative(母语 方法)
12-23 10:58:06.730: WARN / System.err(210):at java.lang.reflect.Method.invoke(Method.java:515)
12-23 10:58:06.730: WARN / System.err(210):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:739)
12-23 10:58:06.730: WARN / System.err(210):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)
12-23 10:58:06.730: WARN / System.err(210):at dalvik.system.NativeStart.main(母语 方法)
答案 0 :(得分:1)
遇到同样的问题并发现:http://code.google.com/p/ksoap2-android/issues/detail?id=35
见评论15和17。
他们建议你把调用包装成“androidHttpTransport.call(SOAP_ACTION,envelope);” 在try / catch中,如果出现错误,请再试一次。
OR
将系统属性“http.keepAlive”设置为“false”。
稍后在该问题中有人建议使用“KeepAliveHttsTransport”。
对我来说,(我承认它很脏)try / catch工作得很好。
编辑错字
答案 1 :(得分: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。解决了连接问题,现在只需要弄清楚数据传输的事情。