1

我已经在这里查看了关于使用 KSOAP2 的 Android 中的 XmlPullParserException 的几个不同的问题/答案,但到目前为止,没有什么能帮助我找出问题所在。我开始将我的 iOS 应用程序移植到 Android,现在我被困在让应用程序与 .Net Web 服务通信的这一部分。下面是有问题的代码,其中大部分是从各种不同的问题/博客/站点拼凑而成的,因为我在 Web 服务上也有一个自签名证书。如果有人有任何提示或可以向我指出一些阅读的方向,这将帮助我弄清楚这将是很好的,因为应用程序的其他几个区域使用 Web 服务,我知道我需要知道如何比我现在得到的更好地调试它。

String URL = "https://online.ensinet.com/Services/ENSIMobileservice.asmx";
            String SOAP_ACTION = "http://ensinet.com/VerifyRep";
            String NAMESPACE = "http://ensinet.com/";
            String METHOD_NAME = "VerifyRep";
            String SERVER = "online.ensinet.com";

            SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME);

            //PropertyInfo usernamePI = new PropertyInfo();
            //usernamePI.setName("RepLogin");
            //usernamePI.setValue(username);
            //usernamePI.setType(String.class);
            request.addProperty("RepLogin", username);

            //PropertyInfo passPI = new PropertyInfo();
            //passPI.setName("RepPass");
            //passPI.setValue(passphrase);
            //passPI.setType(String.class);
            request.addProperty("RepPass",passphrase);

            SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
            envelope.dotNet = true;
            envelope.setOutputSoapObject(request);
            try
            {
                allowAllSSL();
                HttpsTransportSE androidHttpTransport = new HttpsTransportSE(SERVER,443, URL, 1000);
                androidHttpTransport.call(SOAP_ACTION,envelope);  
                SoapObject response=(SoapObject) envelope.getResponse();

            Log.i("Message", "the response contains: " + response.toString());
            }
            catch(Exception e)
            {
                Log.i("Message", "there was an error: " + e);
            }

好的,这里有更多信息。首先,allowAllSSL() 是我在另一个论坛中发现的一种绕过自签名证书的凭据管理器的方法,因为我没有凭据,并且移动设备收集的信息不像 Web 应用程序那样敏感托管所有 Web 服务的地方。以下是设置假凭证管理器的详细方法

    private static TrustManager[] trustManagers;

public static class _FakeX509TrustManager implements
        javax.net.ssl.X509TrustManager {
    private static final X509Certificate[] _AcceptedIssuers = new X509Certificate[] {};

    public void checkClientTrusted(X509Certificate[] arg0, String arg1)
            throws CertificateException {
    }

    public void checkServerTrusted(X509Certificate[] arg0, String arg1)
            throws CertificateException {
    }

    public boolean isClientTrusted(X509Certificate[] chain) {
        return (true);
    }

    public boolean isServerTrusted(X509Certificate[] chain) {
        return (true);
    }

    public X509Certificate[] getAcceptedIssuers() {
        return (_AcceptedIssuers);
    }
}

public static void allowAllSSL() {

    javax.net.ssl.HttpsURLConnection
            .setDefaultHostnameVerifier(new HostnameVerifier() {
                public boolean verify(String hostname, SSLSession session) {
                    return true;
                }
            });

    javax.net.ssl.SSLContext context = null;

    if (trustManagers == null) {
        trustManagers = new javax.net.ssl.TrustManager[] { new _FakeX509TrustManager() };
    }

    try {
        context = javax.net.ssl.SSLContext.getInstance("SSL");
        context.init(null, trustManagers, new SecureRandom());
    } catch (NoSuchAlgorithmException e) {
        Log.e("allowAllSSL", e.toString());
    } catch (KeyManagementException e) {
        Log.e("allowAllSSL", e.toString());
    }
    javax.net.ssl.HttpsURLConnection.setDefaultSSLSocketFactory(context
            .getSocketFactory());
}
}

另外,我查看了 requestDump 并注意到请求中有一个<Header />标签不是实际 Web 服务请求的一部分,所以我认为这是由 KSOAP2 添加的,到目前为止我还没有看到方法删除它,这可能是我得到的 START TAG 错误的一部分。我想我将手动构建 SOAP 请求,我将在今晚晚些时候尝试看看是否可行。

4

1 回答 1

0

好的,所以我能够找出问题所在。看起来 android 端比 iOS 端更具体一些,因为问题是我使用的 URL。在上面的代码中,我使用的是可用于移动应用程序的操作的完整列表的 URL,就像在 iOS 代码中一样,但我需要使用我正在调用的操作的实际 URL(所以我需要添加 ?op =VerifyRep 到上述 URL 字符串的末尾)。现在我得到了正确的响应,所以它进入下一步并试图弄清楚如何解析出所需的数据。

于 2012-10-11T05:37:36.853 回答