【问题标题】:Can't connect to WCF service on Android无法连接到 Android 上的 WCF 服务
【发布时间】:2009-12-22 23:10:23
【问题描述】:

我正在尝试使用 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) 而导致缺少方法或库,程序无法打开连接。第二个问题是设置问题。在清单中我没有添加以下设置:

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

我现在遇到了需要解决的 XMLPullParser 问题。

12-23 10:58:06.480: 错误/SOCKETLOG(210):add_recv_stats 接收 0

12-23 10:58:06.710: 警告/System.err(210): org.xmlpull.v1.XmlPullParserException: 意外类型(位置:END_DOCUMENT 空@1:0 在 java.io.InputStreamReader@433fb070)

12-23 10:58:06.710: 警告/System.err(210):在 org.kxml2.io.KXmlParser.exception(KXmlParser.java:243)

12-23 10:58:06.720: 警告/System.err(210):在 org.kxml2.io.KXmlParser.nextTag(KXmlParser.java:1363)

12-23 10:58:06.720: 警告/System.err(210):在 org.ksoap2.SoapEnvelope.parse(SoapEnvelope.java:126)

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

12-23 10:58:06.720: 警告/System.err(210):在 org.ksoap2.transport.HttpTransportSE.call(HttpTransportSE.java:100)

12-23 10:58:06.730: 警告/System.err(210):在 org.example.android.ValidateUser.onCreate(ValidateUser.java:68)

12-23 10:58:06.730: 警告/System.err(210):在 android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1122)

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

12-23 10:58:06.730: 警告/System.err(210):在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2157)

12-23 10:58:06.730: 警告/System.err(210):在 android.app.ActivityThread.access$1800(ActivityThread.java:112)

12-23 10:58:06.730: 警告/System.err(210):在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1581)

12-23 10:58:06.730: 警告/System.err(210):在 android.os.Handler.dispatchMessage(Handler.java:88)

12-23 10:58:06.730: 警告/System.err(210):在 android.os.Looper.loop(Looper.java:123)

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

12-23 10:58:06.730: 警告/System.err(210):在 java.lang.reflect.Method.invokeNative(Native 方法)

12-23 10:58:06.730: 警告/System.err(210):在 java.lang.reflect.Method.invoke(Method.java:515)

12-23 10:58:06.730: 警告/System.err(210):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:739)

12-23 10:58:06.730: 警告/System.err(210):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:497)

12-23 10:58:06.730: 警告/System.err(210):在 dalvik.system.NativeStart.main(Native 方法)

【问题讨论】:

  • 不确定第一个日志,但在第二个日志中,“未知错误”来自本机代码中未处理的 SOCKERR_。在开始'unknown socket error'上方应该有一个logcat条目那是什么?
  • 我编辑了日志以显示异常上方的 5 行。
  • 我能够解决未知的套接字异常。似乎我忽略了(并且相当不知道)我必须添加到我的清单文件中的设置。即:。现在我有一个需要弄清楚的 XMLPullParserException。
  • kSOAP2-Android 中似乎有一个错误。它使用的 Envelope NS 至少与 WCF 不兼容,并且没有在方法名称的 NS 之前添加“urn:”。

标签: android wcf soap


【解决方案1】:

遇到了同样的问题,发现了这个: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 工作得很好。

编辑错字

【讨论】:

    【解决方案2】:

    得到这个工作。清单文件存在如上所述的一些问题。除此之外,NAMESPACE、SOAP_ACTION 和 URL 参数不正确。与 SOAP_ACTION 一样,NAMESPACE 需要在其前面加上“uri:”。 URL 需要指定一个端点,所以它需要是http://192.168.1.2:8002/WebService.Mobile.svc/Mobile 而不是http://192.168.1.2:8002/WebService.Mobile.svc。连接问题已解决,现在只需要弄清楚数据传输的事情。

    【讨论】:

    • 您提到必须将 'uri:' 添加到命名空间。您的最终命名空间是否看起来像: private static final String NAMESPACE = "uri://tempuri.org/mobile/";你能发布你的最终代码吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多