我正在尝试使用 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) 的修改库,由于缺少方法或库,程序无法打开连接。第二个问题是设置问题。在 list 中我没有添加以下设置:
<uses-permission android:name="android.permission.INTERNET" />

我现在遇到了 XMLPullParser 的问题,我需要弄清楚。

最佳答案

有同样的问题,发现这个:http://code.google.com/p/ksoap2-android/issues/detail?id=35

见评论 15 和 17。

他们建议您将调用包装到“androidHttpTransport.call(SOAP_ACTION,envelope);”
在 try/catch 中,并在出现错误时重试。

或者

将系统属性“http.keepAlive”设置为“false”。

后来在那个问题上有人建议使用“KeepAliveHttsTransport”。

对我来说,(我承认它很脏)try/catch 工作得很好。

编辑错字

10-08 16:52