2012-10-09 108 views
1

我查看了幾個不同的問題/答案,這裏有關於Android中使用KSOAP2的XmlPullParserException的問題,但迄今爲止沒有任何東西能幫助我找出問題所在。我開始將我的iOS應用程序移植到Android上,現在我被困在讓應用程序與.Net Web服務進行通信的這一部分。以下是有問題的代碼,其中大部分代碼是由各種不同的問題/博客/網站拼湊而成的,因爲我在Web Service上也有一個自簽名證書。如果任何人有任何提示或可以指向我的一些閱讀的方向,這將幫助我弄清楚這將是很好的,因爲應用程序還有其他幾個領域使用Web服務,我知道我將需要知道如何比我現在得到的更好地進行調試。Android和HTTPS Web服務(XmlPullParserException)

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 erro的一部分。我想我會手動生成SOAP請求,我將在今晚晚些時候嘗試,看看是否有效。

+0

發佈完整堆棧跟蹤。 'allowAllSSL()'聽起來很可疑,它有什麼作用?郵政編碼。一般來說,如果你有一個自簽名證書,你應該設置應用程序來信任它,允許_any_證書是一個_bad idea_。 –

回答

0

好吧,所以我能弄清楚這個問題。它看起來像Android側比iOS側更具體,因爲問題是我使用的URL。在上面的代碼中,我使用的是iOS代碼中可用於移動應用程序的完整操作列表的URL,但我需要使用我調用的操作的實際URL(所以我需要添加?op = VerifyRep到上面的URL字符串的末尾)。現在我得到了正確的答案,所以它已經到了下一步,並試圖弄清楚如何解析出所需的數據。